代理背后的GitHub Windows客户端


93

我正在尝试使Windows的GitHub客户端正常工作。我在公司代理和防火墙后面的公司Win 7 x64计算机上。在研究了其他各种文章之后,并尝试了环境变量和配置变量的多种组合,我发现使克隆和推送更新正常工作的唯一方法是使用HTTPS_PROXY环境变量,包括我的完整公司域用户ID和密码。

从安全角度来看,这是不可接受的。还有其他方法可以使它起作用吗?

补充笔记:

以下工作:

  • 添加所谓的环境变量HTTPS_PROXY与值http://[domain]\[userid]:[password]@someproxy.mycorp.com:8080

以下无效

  • HTTPS_PROXY变量中省略用户名和密码
  • 使用名为HTTP_PROXY(no S)的环境变量
  • 添加 http.proxy变量到全局配置文件(.gitconfig
  • https.proxy变量添加到全局配置文件

在所有情况下,GitHub 客户端仍然无法识别代理:文件的内容在启动时TheLog.txt 始终显示以下内容:

[time]|INFO|thread:4|GitHub.Helpers.StartupLogger|Proxy information: (None)
[time]|INFO|thread:4|GitHub.Helpers.StartupLogger|Couldn't fetch creds for proxy

并且紧随其后是几次失败的代理身份验证尝试的输出,所有这些尝试都表明“凭据丢失”。


2
添加环境变量对我而言是成功的诀窍,但这是不可接受的解决方案,因为它将我的域/密码暴露给有权访问环境变量的任何应用程序。
Fabricio

jacobbenson.com/?p=302#sthash.DzPYdGUU.dpbs解释说,这是由gui(正确使用Windows设置代理)对git命令在后台调用msysgit引起的。msysgit使用libcurl来处理HTTP请求,而不使用Windows代理设置。目前正在进行一些工作来修复此问题,包括github.com/libgit2/libgit2sharp的libgit2sharp
安德鲁·希尔

Answers:


131

将这些条目添加到用户目录中的“ .gitconfig”文件中(转到%USERPROFILE%):

[http]
    proxy = http://<proxy address>:<proxy port>

[https]
    proxy = https://<proxy address>:<proxy port>

而且,如果您不想以明文形式存储密码,我将使用本地代理转发器(如CNTLM),该代理可通过它定向所有流量并可以存储散列的密码。


与原始问题不同,如果您不关心密码是否为纯文本,请添加以下内容:

[http]
    proxy = http://<username>:<password>@<proxy address>:<proxy port>

[https]
    proxy = https://<username>:<password>@<proxy address>:<proxy port>

如果您需要针对代理的授权,请参见edufinn答案:proxy = http:// <用户名>:<密码> @ <企业代理>:<端口>
Jan Hommes 2014年

1
@JanHommes最初的问题是专门询问如何在不以明文形式存储密码的情况下
Sogger 2014年

@Sogger如果我的密码包含“ @”字符,我应该如何配置密码,谢谢您的帮助。
2014年


4
如果您使用的是CNTLM,请确保按照建议将代理指向127.0.0.1而不是localhost。在Windows中,似乎localhost首先指向CNTLM不监听的IPv6地址。这样,git将等到超时(数分钟)后再切换到IPv4地址。
RonanPaixão2015年

14

尝试了以上所有内容-但没有成功,只有帮助我的是CNTLM- http ://cntlm.sourceforge.net/ 。

安装它并运行cntlm -H,然后对corp代理进行身份验证,使用cntlm的输出编辑cntlm.ini文件,然后重新启动Windows服务。使用以下命令更新.gitconfig:

[https] proxy = localhost:3128
[http] proxy = localhost:3128

现在,cntlm将完成所有身份验证,您将可以在corp代理后面使用GitHub(和Dropbox,btw)。至少直到下一次密码更改为止:)(比再次执行cntlm -H东西)


2
如果完成git clone,fetch或pull之类的远程操作需要很长时间才能完成,请尝试将.gitconfig切换为:[https]代理= 127.0.0.1:3128 [http]代理= 127.0.0.1:3128
jhamm

重新启动什么Windows服务?
Mukus,2015年

@Mukus cntlm-如果我没记错的话,它在安装后以服务模式运行。
安东2015年

我进行了更改,然后重新启动,但仍然无法正常工作。
Mukus,2015年

8

我能够使GitHub Shell与我们的公司代理一起使用。我正在启动GitHub Shell并执行以下命令:

export http_proxy=http://<username>:<password>@<corporate proxy>:3128

我真的很想让GUI也能正常工作。但是我不想设置包含我的公司凭据信息的Windows全局环境变量。

奇怪的是,GitHub GUI Client能够连接到GitHub以进行用户身份验证,但是唯一的问题是从GitHub进行克隆,将项目推入和推入GitHub的问题。看来问题出在git的实现上。我能够将git配置为通过我们的代理运行,而无需将我的凭据放在git全局设置中,并且它在执行拉取或推送请求时要求我提供凭据。但这仅在Git Shell中有效。


那是因为GitHub可能会使用某些组件从内部进行身份验证,该组件会从OS中提取代理信息,可能是某些SingleSignOn解决方案,而git本身不会。我对SourceTree有同样的问题。我还发现,当git工作时,它花费的时间不可能太长,从而使SourceTree的使用成为不可能。
RonanPaixão2015年

这可能是因为Github尝试使用git端口,该端口通常经过过滤,因为它不是IT人员可以看到的常见端口。请参阅我的答案。
dragon788 '16

7

如果您在企业中使用Windows的GitHub,则很可能背后有一个糟糕的企业防火墙/代理。Windows版GitHub在其GUI中尚没有用于设置选项的代理参数。

要将GitHub配置为Windows以使用您的公司代理,请编辑.gitconfig文件,该文件通常位于C:\ Users \ .gitconfig或C:\ Documents&Settings \ .gitconfig中

关闭适用于Windows的GitHub; 在.gitconfig中,只需添加

[https]代理= proxy.yourcompany.com:端口


4

我也遇到了这个问题,并尝试对它进行深入研究(拆卸了客户端)。

生成我们所看到的日志消息的代码如下:

private static void LogProxyServerConfiguration()
{
    WebProxy defaultProxy = WebProxy.GetDefaultProxy();
    string str = defaultProxy.Address != (Uri)null ? defaultProxy.Address.ToString() : "(None)";
    StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Proxy information: {0}", str);
    try
    {
        if (defaultProxy.Credentials == null)
        {
            StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Couldn't fetch creds for proxy", new object[0]);
        }
        else
        {
            NetworkCredential credential = defaultProxy.Credentials.GetCredential(GitHubClient.GitHubDotComUri, "Basic");
            StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Proxy is authenticated: {0}", credential != null && !string.IsNullOrWhiteSpace(credential.UserName));
        }
    }
    catch (Exception ex)
    {
        StartupLogger.log.InfoException("Couldn't fetch creds for proxy", ex);
    }
}

因此,此块仅记录在IE中设置的代理信息。日志消息似乎与我们在配置文件或环境变量中设置的内容无关。


3

我不知道您的防火墙,但我的校园使用代理

你用任何git gui吗?编辑:刚注意到您正在使用github客户端的Windows

我正在使用tortoisegit,它非常容易设置代理。只需右键单击任何地方,tortoisegit>网络,启用代理服务器并设置服务器地址,用户名和密码。做完了

据我所记得,tortoisegit也可以与github开箱即用。


2

这是在github中设置代理的方法

git config --global http.proxy http://<username>:<pass>@<ip>:<port>
git config --global https.proxy http://<username>:<pass>@<ip>:<port>

在我的大学里,我们没有用户名和密码,因此,如果我们的大学ip为172.16.10.10,端口为8080

git config --global http.proxy http://172.16.10.10:8080
git config --global https.proxy http://172.16.10.10:8080

PS->我建议您使用此方法来设置代理,因为随着您学习的深入,事情将会逐渐
成熟。



1

对于我们来说,解决方案涉及两件事。首先,如Sogger的回答所述,您需要将条目添加到.gitconfig文件中的%USERPROFILE%

[http]
    proxy = http://<proxy address>:<proxy port>

[https]
    proxy = https://<proxy address>:<proxy port>

其次,(这是我们缺少的部分),您需要在代理服务器上配置一个例外,以允许未经身份验证的代理流量*.github.com

在iPrism中,它看起来像这样: 在此处输入图片说明

问题不只是代理,而是身份验证。绕过身份验证要求可允许所需的通信使用GitHub桌面客户端克隆并使用项目。

还要注意,此方法不需要.gitconfig文件中存储代理凭据

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.