使用一个袜子代理与GIT的HTTP传输

如何使git使用袜子代理的HTTP传输?

我用GIT_PROXY_COMMANDconfigurationgit来成功使用socks代理进行GIT传输。

另外我已经configuration我的.curlrc文件来定义袜子代理,我可以直接用curl命令获取信息,如:

curl http://git.kernel.org/pub/scm/git/git.git/info/refs?service=git-upload-pack 

但是,如何使用socks代理和git来使用http传输协议来检索数据,例如:

 git clone http://git.kernel.org/pub/scm/git 

我使用Git 1.8.2和SOCKS v5代理进行了testing,下面是对我的设置:

git config --global http.proxy 'socks5://127.0.0.1:7070'

更新2017-3-31:

根据该文件 ,尽pipe名称http .proxy ,它应该为HTTP和HTTPS存储库url工作。 感谢@user指出这一点。

如果您不想将代理设置为全局configuration,请尝试ALL_PROXY=例如:

 $ ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/some/one.git 

(只是稍微提醒一下)如果你想让主机名也被代理parsing(这意味着通过代理传递所有东西 ),特别是当你克隆一个要点的时候 ,你可以使用下面的设置(关键是它使用socks5h代替袜子5 ):

 git config --global http.proxy socks5h://127.0.0.1:1080 

对于git://协议,我们使用Git和SOCKS代理 。 但是,似乎git没有正确支持袜子代理。 git本身链接到libcurl。 所以没有使用.curlrc文件(这只是curl命令行客户端)。 但是,以下补丁提供了必要的支持。 将这个补丁应用于git,我们可以简单地将ALL_PROXY环境variables或者HTTP_PROXY或者HTTPS_PROXY设置为socks://hostname:portnum portnum(或者socks4 / socks5),或者实际上http.proxy gitconfiguration设置和libcurl实际上会使用socks协议当使用代理。

例如,一个活动轨迹:

 $ GIT_CURL_VERBOSE=1 bin-wrappers/git -c "http.proxy=socks://localhost:1080" ls-remote http://github.com/patthoyts/tclftd2xx.git * Couldn't find host github.com in the _netrc file; using defaults * About to connect() to proxy localhost port 1080 (#0) * Trying 127.0.0.1... * connected * SOCKS4 request granted. * Connected to localhost (127.0.0.1) port 1080 (#0) > GET /patthoyts/tclftd2xx.git/info/refs?service=git-upload-pack HTTP/1.1 User-Agent: git/1.8.1.msysgit.1.dirty ... and on to a successful request ... 

必要的补丁:

 diff --git a/http.cb/http.c index 3b312a8..f34cc75 100644 --- a/http.c +++ b/http.c @@ -322,6 +322,14 @@ static CURL *get_curl_handle(void) if (curl_http_proxy) { curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy); curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); +#if LIBCURL_VERSION_NUM >= 0x071800 + if (!strncmp("socks5", curl_http_proxy, 6)) + curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + else if (!strncmp("socks4a", curl_http_proxy, 7)) + curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A); + else if (!strncmp("socks", curl_http_proxy, 5)) + curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); +#endif } return result; 

我使用以下命令从socks5代理克隆特定的存储库。 代理设置使用--config选项指定。

 $ git clone https://github.com/xxxxx --config 'http.proxy=socks5://127.0.0.1:1234'