96

如何让 git 使用 socks 代理进行 HTTP 传输?

我成功地使用 GIT_PROXY_COMMAND 配置 git 以使用 socks 代理进行 GIT 传输。

另外,我已经配置了我的 .curlrc 文件来定义 socks 代理,我可以使用 curl 命令直接获取信息,例如:

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

但是如何使用带有 git 的 socks 代理来使用 HTTP 传输协议检索数据,例如:

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

8 回答 8

173

我使用 Git 1.8.2 和 SOCKS v5 代理进行了测试,以下设置对我有用:

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

2017 年 3 月 31 日更新:

根据文档,尽管名称,它应该适用于 HTTP 和 HTTPS 存储库 url。感谢@user 指出这一点。http.proxy

2018 年 11 月 27 日更新:

要禁用代理,请运行命令:

git config --global --unset http.proxy

编辑 2019-03-04:

如果您还希望使用代理解析主机名,请使用下面的 thuzhf 解决方案,它使用socks5h而不是socks5

于 2013-05-26T04:27:16.627 回答
63

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

$ ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/some/one.git
于 2015-10-12T09:21:20.833 回答
51

(稍微提醒一下)如果您希望主机名也由代理解析(这意味着通过代理传递所有内容),尤其是在克隆gist时,您可以使用以下设置(关键是它使用socks5h袜子5 ) :

git config --global http.proxy socks5h://127.0.0.1:1080
于 2017-06-10T12:28:58.870 回答
18

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

$ git clone https://github.com/xxxxx --config 'http.proxy=socks5://127.0.0.1:1234'
于 2015-08-16T15:36:04.497 回答
7

注意:这里的补丁在 2015 年应用于 git 的 2.4.11 版本。从那时起,您可以将 socks:// url 与 http.proxy 配置设置一起使用。

对于 git:// 协议,我们有Using Git with a SOCKS proxy。但是,git 似乎没有正确支持 socks 代理。git 本身链接到 libcurl。因此不使用 .curlrc 文件(仅用于 curl 命令行客户端)。但是,以下补丁提供了必要的支持。将此补丁应用于 git 后,我​​们可以简单地将 ALL_PROXY 环境变量或 HTTP_PROXY 或 HTTPS_PROXY 设置为socks://hostname:portnum(或 socks4/socks5),或者实际上是 http.proxy git config 设置,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;
于 2013-03-05T16:03:37.343 回答
3

只需参考@briankip 并删除Yang.Y 提到的http 代理设置,您就可以直接编辑ini 文件。

您也可以在命令行上使用

git config --global --unset http.proxy

要确认它已被删除,请使用列出当前配置

git config --list

于 2018-05-14T06:30:32.870 回答
2

建议的方法都不适合我,所以我找到了另一种方法,如下所示:


  1. SOCKS5使用以下协议通过协议创建隧道(动态端口转发)ssh
    ssh -ND 9994 user@YourSshServer

  1. 安装proxychains在您的本地主机上,而不是您连接到的 ssh 服务器上:

  1. 编辑您的proxychains配置文件:
    sudo nano /etc/proxychains.conf然后在文件末尾添加以下行:
    socks5 127.0.0.1 9994

  1. 现在我们准备做一个git命令(proxychains必须放在命令之前):
    proxychains git push origin develop
于 2019-11-20T10:24:08.840 回答
2

不幸的是,以上都没有对我有用,但是这样做了:

nano ~/.ssh/config

添加:

Host my-host.foo.bar.com
    ProxyJump username@host.local

其中 'host.local' 是一个香草 mac,在共享设置中启用了“远程登录”。为我工作:)

于 2021-01-04T06:05:00.090 回答