【问题标题】:Using a socks proxy with git for the http transport使用带有 git 的 socks 代理进行 http 传输
【发布时间】:2013-02-20 01:12:51
【问题描述】:

如何让 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

【问题讨论】:

标签: git ssh proxy socks


【解决方案1】:

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

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

2017 年 3 月 31 日更新:

According to the document,尽管名称为 http.proxy,它应该适用于 HTTP 和 HTTPS 存储库 URL。感谢@user 指出这一点。

2018 年 11 月 27 日更新:

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

git config --global --unset http.proxy

编辑 2019-03-04:

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

【讨论】:

  • brantyoung,谢谢!我忘记支付互联网连接费用并且没有外部连接。我使用另一台服务器作为网关:ssh -D 4000 @server -p,并成功将项目上传到 github:git config http.proxy 'socks5://localhost:4000'。谢谢。
  • 如何取消设置?我要设置为''吗?
  • @briankip 打开~/.gitconfig 并删除[https.proxy][http.proxy] 部分,这是一个ini 文件,请随意编辑。
  • @briankip,我认为你可以把它放在命令行上,而不是永久地放在你的配置中,例如git -c http.proxy=socks5://127.0.0.1:7070,或类似的东西。也许你可以给它起一个别名gitsocks,这样你就可以轻松地根据需要调用带有和不带有socks的git`
  • 我只能在将协议更改为 'socks5h://
    ' 后才能完成这项工作('h' 代表主机名解析;参见 @ 987654334@. "使其等同于 --socks5-hostname")
【解决方案2】:

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

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

【讨论】:

  • 谢谢!这确实对我有帮助,而全球则没有。
  • 谢谢!真的有效!
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这是我唯一的解决方案,与 'ssh -D xxx' 组合
    【解决方案5】:

    注意:这里的补丁在 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;
    

    【讨论】:

    • 就像我写的那样,我成功地将 git 配置为使用 socks 代理进行 GIT 传输。我想要的是使用 git 和 socks 代理进行 HTTP(S) 传输
    【解决方案6】:

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

    您也可以在命令行上使用

    git config --global --unset http.proxy

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

    git config --list

    【讨论】:

      【解决方案7】:

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


      1. 使用ssh:
        ssh -ND 9994 user@YourSshServerSOCKS5 协议上建立隧道(动态端口转发)

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

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

      1. 现在我们准备执行git 命令(proxychains 必须放在命令之前):
        proxychains git push origin develop

      【讨论】:

        【解决方案8】:

        不幸的是,上述方法都不适合我,但这确实有效:

        nano ~/.ssh/config
        

        添加:

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

        其中“host.local”是在共享设置中“启用远程登录”的普通 mac。为我工作:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          相关资源
          最近更新 更多