如何通过 HTTP 代理从 Git 存储库拉取代码?

535

注意:虽然描述的用例涉及在项目中使用子模块,但同样适用于通过HTTP克隆存储库的常规git clone

我有一个Git控制的项目。我想添加一个子模块:

git submodule add http://github.com/jscruggs/metric_fu.git vendor/plugins/metric_fu

但我理解

...
got 1b0313f016d98e556396c91d08127c59722762d0
got 4c42d44a9221209293e5f3eb7e662a1571b09421
got b0d6414e3ca5c2fb4b95b7712c7edbf7d2becac7
error: Unable to find abc07fcf79aebed56497e3894c6c3c06046f913a under http://github.com/jscruggs/metri...
Cannot obtain needed commit abc07fcf79aebed56497e3894c6c3c06046f913a
while processing commit ee576543b3a0820cc966cc10cc41e6ffb3415658.
fatal: Fetch failed.
Clone of 'http://github.com/jscruggs/metric_fu.git' into submodule path 'vendor/plugins/metric_fu'

我已经设置了我的HTTP_PROXY:

c:\project> echo %HTTP_PROXY%
http://proxy.mycompany:80

我甚至为 HTTP 代理设置了一个全局 Git 设置:

c:\project> git config --get http.proxy
http://proxy.mycompany:80

有人通过代理服务器始终能够成功进行HTTP获取吗?真正奇怪的是,GitHub 上的一些项目工作得很好(例如 awesome_nested_set),但其他一些项目始终失败(例如rails)。


你的代理服务器是否可能对某些词语进行审查或其他限制,从而只影响那些包含这些词语的字节流的仓库? - pjz
9
可能是如何让 Git 在代理服务器下工作的重复问题。 - alvaro
6
@alvaro,我认为你的意思是如何在代理服务器上使用Git可能与这个问题重复。这个问题比你提到的那个问题要旧。 - Derek Mahar
2
@James,你的Git代理服务器的“全局”设置实际上并不是全局的,而是本地的。要使其全局生效,你需要在git config命令中提供参数--global - Derek Mahar
万一有人想知道为什么Git会忽略代理设置:请确保您使用的是地址,而不是Git协议,即将 git://github.com/SomeProject/foo.git 更改为 https://github.com/SomeProject/foo.git。 - Hi-Angel
1
@DerekMahar 如果较新的问题质量更好(或更普遍适用),则旧问题可能会被关闭为较新问题的重复。 - Raedwald
30个回答

637

你还可以在全局配置属性 http.proxy 中设置 Git 使用的 HTTP 代理:

git config --global http.proxy http://proxy.mycompany:80

要与代理进行身份验证:

git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:8080/

(本翻译内容参考@EugeneKulabuhov@JaimeReynoso提供的身份验证格式。)


8
这对我有效:在用户环境变量中设置HTTP_PROXY(Windows操作系统),然后使用$HTTP_PROXY(大写)来运行上述命令。对于这个解决方案点赞。 - Sean Aitken
4
在Windows上,CleverCoder需要指定%HTTP_PROXY%,而不是$HTTP_PROXY(除非你当然在运行Cygwin)。我将编辑我的答案以适用于Windows环境,而不是Unix环境。 - Derek Mahar
28
使用 git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:8080 语法来提供用户名和密码。 - Eugene Kulabuhov
2
对于那些可能在代理方面遇到问题的人,http://<UserID>:<Password>@<ProxyURL>:<Port>/ 对我很有效。 - Jaime Reynoso
1
@Mr.Hyde,请查看https://dev59.com/emgu5IYBdhLWcg3wgnZh。 - Derek Mahar
显示剩余9条评论

152

已经有一些很好的回答了。然而,我想提供一些帮助,因为有些代理服务器需要您使用用户ID和密码进行身份验证。有时这可能是在域上。

例如,如果您的代理服务器配置如下:

Server: myproxyserver
Port: 8080
Username: mydomain\myusername
Password: mypassword

然后,使用以下命令将其添加到您的.gitconfig文件中:

git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:8080

不用担心https。只要指定的代理服务器支持http和https,那么配置文件中的一个条目就足够了。 你可以通过执行cat .gitconfig命令来验证该命令是否成功将条目添加到您的.gitconfig文件中: 在文件末尾,您将看到一个如下所示的条目:
[http]
    proxy = http://mydomain\\myusername:mypassword@myproxyserver:8080

就是这样!

有趣。我能够 100% 地到达“解决差异”部分,但是克隆过程似乎就这样挂起了。有人有这方面的经验吗? - Roman
1
+1。很快,您将能够为每个URL设置代理! - VonC
@apoplexy,您能否评论一下您建议的编辑,这样我就可以考虑了。 - Max MacLeod
3
如果您的用户名或密码中包含 "@" 符号,可以使用 URL 编码 "%40" 来代替它,这样就可以正常使用了。 - Adarsha
3
不用查看 .gitconfig 文件,你可以使用 git config --list 命令列出配置设置。 - user3969377

138
最终有效的方法是设置http_proxy环境变量。我已经正确设置了HTTP_PROXY,但是Git似乎更喜欢小写版本。

3
http.proxy设置在全局Git配置中是否有效? 在你的问题中,你将http.proxy设置在本地仓库配置中。 - Derek Mahar
24
好的,我会尽力进行翻译。这句话的含义是:在我的情况下,我需要设置https_proxy - M Smith
1
https.proxy 对我很有效,因为我正在使用 GitHub 上的 https。 - Shervin Asgari
3
如果你必须设置 https_proxy,那么这意味着你正在使用的是 https 而不是这个问题所涉及的 http - Piotr Dobrogost
4
Curl和libcurl不识别大写的HTTP_PROXY和HTTPS_PROXY。请查看此链接获取更多信息:http://curl.haxx.se/mail/archive-2001-12/0034.html。 - Doug
显示剩余4条评论

66
如果你只想在特定的存储库上使用代理,并且不需要在其他存储库上使用,最好的方法是在使用git clone克隆存储库时使用-c, --config <key=value>选项。

E.g.,

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --config "http.proxy=proxyHost:proxyPort"

这很奇怪,我尝试设置 $http_proxy,但 git 没有遵守它。看起来它只关心自己的配置... - weberc2
可以正常工作。您还可以多次指定“--config”,例如当您还想设置“https.proxy”时。 - barfuin
5
需要克隆代理配置但不更改用户的代理配置。正是我所需的!谢谢。 - doom
--config "core.gitProxy..." 是如何设置代理SSH协议而不需要全局代理的命令,谢谢。@alijandro - Carson

55
看起来你在Windows上使用的是MinGW编译的Git(或者可能是其他我没听说过的编译版本)。有办法来调试这个问题:我相信Git的所有HTTP代理工作都是由cURL完成的。在运行Git之前,设置这个环境变量:
GIT_CURL_VERBOSE=1

这至少能让你对幕后发生的事情有个大致的了解。

7
当我添加这个环境变量时,msysgit没有额外输出任何东西。 :( - Andrew Arnott
在与代理服务器斗争了一段时间后,这个提示帮助我发现curl的证书数据库丢失/损坏了,这就是请求失败的原因。 - davenpcj

26
当你的网络团队通过重写证书进行SSL检查时,然后使用HTTP URL而不是HTTPS URL,再加上设置这个变量,对我来说起了作用。
git config --global http.proxy http://proxy:8081

2
你也可以将此添加到环境中,以接受网络管理员提供的重写证书来检查你的流量:export GIT_SSL_NO_VERIFY=true - bbaassssiiee
完美运行。谢谢。我只需要添加git config --global http.proxy http://proxy:8081git config --global https.proxy http://proxy:8081 - Sid
1
感谢@sethbc和@datasmid!我需要GIT_CURL_VERBOSE=1来进行调试,GIT_SSL_NO_VERIFY=true来跳过验证。 - Henry Rivera
不起作用。甚至连GIT_SSL_NO_VERIFY变量也不起作用。 - keinabel

21

对我来说,git://在代理服务器上无法使用,而https://可以。这给我带来了一些麻烦,因为我运行的脚本都使用git://,所以我不能轻松地将它们全部更改。不过,我找到了这个GEM。

git config --global url."https://github.com/".insteadOf git://github.com/

我知道我也曾经在从git://拉取代码时遇到过问题。你有考虑过SSH密钥的问题吗?我的问题是由于SSH密钥配置不正确导致的。 - avazula

20
你还可以在Windows系统的%userprofile%目录下(notepad %userprofile%.gitconfig)或Linux系统的~目录下(vi ~/.gitconfig)编辑位于.gitconfig文件,并按照以下方式添加一个HTTP部分.gitconfig文件的内容:
[http]
        proxy = http://proxy.mycompany:80

18
如果你使用的是Windows操作系统,考虑设置HTTPS_PROXY,如果你通过https URL进行检索的话。这对我来说起作用了!

2
在我的情况下(Windows XP上的msysgit),仅设置https_proxy环境变量就足够了(没有设置git全局或存储库代理选项)。 - Piotr Dobrogost

14

我发现无论是 http.proxy 还是 GIT_PROXY_COMMAND 都无法在我的身份验证的 HTTP 代理中工作。无论哪种方式都无法触发代理。但我找到了一个解决办法。

  1. 安装 corkscrew,或者其他你想要的替代品。

  2. 创建一个 authfile。authfile 的格式是:user_name:password,其中 user_namepassword 是你访问代理的用户名和密码。要创建这样的文件,只需运行以下命令:echo "username:password" > ~/.ssh/authfile

  3. 编辑 ~/.ssh/config,并确保其权限为 644chmod 644 ~/.ssh/config

以 github.com 为例,在 ~/.ssh/config 中添加以下行:

Host    github.com
        HostName        github.com
        ProxyCommand    /usr/local/bin/corkscrew <your.proxy> <proxy port> %h %p <path/to/authfile>
        User            git

现在无论你在做什么与git@github.com相关的事情,它都会自动使用代理。你也可以轻松地对Bitbucket做同样的操作。
这种方法可能不够优雅,但它确实非常有效。

1
请问您能详细说明第二步“创建authfile”吗?看起来您的方法是唯一适用于git:// URL的方法。 - nik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接