在Windows系统上使用Git,通过HTTP代理连接,且不将代理密码存储在磁盘上。

53

我在Windows上使用Git,在公司网络中,我在HTTP代理后面,需要进行基本身份验证。出站SSH不起作用,因此我必须通过代理使用HTTPS。

我知道如何使用git config http.proxy将设置配置为http://[username]:[password]@[proxy]:[port]

然而,特别是因为这是一台共享机器,我不想在我的.gitconfig中存储密码。此外,使用git config命令更改我的.gitconfig会使我的密码出现在我的bash历史记录中,因此即使我记得在会话结束时清除我的.gitconfig,我几乎肯定会忘记清除我的历史记录。

我尝试设置没有密码的http.proxy,希望在尝试推送/拉取时会提示我输入密码,但是我只收到407代理身份验证所需的信息。我发现的所有信息似乎要么忽略了在.gitconfig中以明文形式保存密码的问题,要么涉及NTLM代理。

我很乐意每次需要连接时键入代理详细信息-目前最好的解决方案是编写一个包装脚本,将在调用git正常时提示我的密码并将其设置为环境变量。这是一个好的解决方案吗?在脚本中为单个调用设置环境变量是否有安全性问题?最好,有哪些内置设置或现有工具可供使用?

5个回答

64

自 git 2.8.0 版本起

git config --global http.proxy http://[user]@proxyhost:port
git config --global credential.helper wincred

对我来说可以运行。(从PowerShell控制台,不使用git bash) 明确一点,“[user]”将被实际的域\用户名(或类似)替换。 当推送/拉取时,我会遇到一个初始错误: 致命:遇到HttpRequestException。 发送请求时发生错误。 ...但是命令会继续执行并完成推送/拉取。 谢谢 @0xA0 - HerbM
尽管我也需要: https.sslverify = false - HerbM
1
这是我见过的最好的解决方案,因为大多数其他建议要么涉及以明文形式存储密码,要么关闭 sslverify - David Brower
这比将密码存储在环境变量中稍微安全一些,因为它可以被用户模式下的任何程序访问。 - Welgriv
对我来说,[user] 没有起作用。我已经将其替换为我的用户名,然后它起作用了。 - Daniels118

43

除了使用 git 设置之外,您还可以使用环境变量(仅在会话期间设置)来实现,如此答案所述:

Instead of using git setting, you can also use environment variable (that you can set just for your session), as described in this answer:

set http_proxy=http://username:password@proxydomain:port
set https_proxy=http://username:password@proxydomain:port
set no_proxy=localhost,.my.company 

因此,您的包装脚本可以在需要时设置环境变量,而不是修改 .gitconfig(并以纯文本方式留下您的密码),仅为当前会话设置。

正如Welgriv指出的那样,这是不安全的,因为用户模式中的任何程序都可以访问环境变量。


现在(2020年,五年后),我更喜欢:

set http_proxy=http://127.0.0.1:3128
set https_proxy=http://127.0.0.1:3128

使用127.0.0.1:3128作为genotrance/px的默认URL,即一个小型HTTP代理服务器,可自动通过NTLM代理进行身份验证。
无需设置密码甚至用户名。


谢谢 vonc * 我可以使用您的答案和 @0xA0 提供的答案的组合 * -- 轻松更改环境中代理的值并使用我的 WinCred 进行身份验证。 - HerbM
1
@HerbM 当然,这两种方法都是有效的,在你的情况下,它们是互补的。 - VonC
由于环境变量可以在用户模式下被任何程序访问,因此这是不安全的。 - Welgriv
@Welgriv 我同意你的观点,并将你的评论包含在答案中以增加可见性。我还提供了另一种解决方案。 - VonC
@FernandoBrustolin 没问题(毕竟,我每天都在这里)。对于px,没有任何设置/安装程序/安装过程:它只是一个你启动并在后台运行的二进制文件。在任何时候都不需要提升特权。 - undefined
显示剩余3条评论

3

VonC的回答并不总是能够解决问题。我不知道为什么,但这可能取决于代理服务器 - 或者可能是其他问题吗?

将存储库的git://协议替换为http://可能会有所帮助。

注意:与VonC的答案一样,您必须首先设置http(s)_proxy环境变量:

set http_proxy=http://username:password@proxydomain:port
set https_proxy=http://username:password@proxydomain:port

例如,克隆大理石的稳定Git通常会像这样克隆(来自大理石文档):

git clone -b Applications/15.12 git://anongit.kde.org/marble ~/marble/sources

在Windows的cmd中(假设已设置http_proxy),则可能需要使用http[s]://
git clone -b Applications/15.12 http://anongit.kde.org/marble ~/marble/sources

这会将密码写入磁盘,而这正是问题想要避免的。 - Rad80

0

我知道这是一篇旧文章,但还是想增加一条注释。在Windows 10中,我在git bash中运行了上述命令 "git config --global https.proxy http://[userid]:[passwordWithSpclChars]@url:port" ... 但由于我的凭据包含特殊字符,我不得不编辑配置文件C:\USERS<userid>.gitconfig以对我的凭据中的特殊字符进行URL编码。然后我就能够从源头获取git信息了。


您还可以使用百分号编码来表示特殊字符:https://stackoverflow.com/a/35195690/6309 - VonC
是的,这仍然在本地存储凭据。然而,设置环境变量设置对我没有起作用。 - iowatiger08

-3

如果您在代理服务器背后,请按照以下步骤操作。

确保端口9418已从防火墙规则中排除。请向网络管理员询问。

如果已经设置了代理,请取消代理设置:

  • git config --global --unset http.proxy
  • git config --global --unset https.proxy

设置正确的代理:

常见错误:

  • 502:URL/IP无法从您的网络访问。
  • 407:代理身份验证被拒绝。
  • 80:代理未正确设置。

3
这会将密码保存到磁盘上,而问题明确要求避免这种情况发生。 - Tom

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