如何使git的使用HTTP传输SOCKS代理?
我与GIT_PROXY_COMMAND配置GIT中使用GIT运输SOCKS代理成功。
另外,我已经配置了我的.curlrc文件中定义的socks代理,我可以直接与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代理测试,以下为我设置的工作原理:
git config --global http.proxy 'socks5://127.0.0.1:7070'
更新2017年3月31日:
根据该文件 ,尽管名称http
.proxy
,它应该适用于HTTP和HTTPS库URL。 感谢@user指出这个。
更新2018年11月27日:
要禁用代理,运行命令:
git config --global --unset http.proxy
编辑2019年3月4日:
如果你也想将主机名使用代理来解决,请使用以下thuzhf的解决方案,它使用socks5h
代替socks5
如果你不想设置代理的全局配置,尽量ALL_PROXY=
例如:
$ ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/some/one.git
(只是一点点提示)如果你想要的主机名也由代理(也就是通过一切通过代理 ),尤其是当你克隆一个要点 ,你可以使用下面的设置来解决(最关键的是它使用socks5h代替SOCKS5的):
git config --global http.proxy socks5h://127.0.0.1:1080
我用下面的命令来克隆从socks5代理特定的资源库。 代理设置与指定--config
选项。
$ git clone https://github.com/xxxxx --config 'http.proxy=socks5://127.0.0.1:1234'
对于git的:我们//协议使用Git用SOCKS代理 。 然而,似乎Git并不正确地支持SOCKS代理。 Git的本身是与libcurl中。 所以.curlrc文件未使用(这还只是针对curl命令行客户端)。 但是,下面的补丁提供了必要的支持。 随着应用的git这个补丁,我们可以简单的设置ALL_PROXY环境变量或HTTP_PROXY或HTTPS_PROXY到socks://hostname:portnum
(或SOCKS4 / SOCKS5)或确实http.proxy混帐配置设定和现在的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.c b/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;
只是参考@briankip和Yang.Y提到你可以直接编辑的ini文件中删除HTTP代理服务器设置。
你也可以使用这样做在命令行
git config --global --unset http.proxy
要确认它已被删除列表使用当前配置
git config --list
您可以尝试临时网络代理ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/your/link.git
8888是你的代理端口,你可以修改它,一般是1080。