0%

关于Visual Studio 的 git error问题以及解决办法

visual studio之前就一直出现的git的代理问题,我今天终于知道解决办法了。

问题分析

众所周知,由于网络环境问题,github最好挂上代理。于是乎,我设置了如下socks代理:

1
2
git config --global http.proxy 'socks5://127.0.0.1:8888'
git config --global https.proxy 'socks5://127.0.0.1:8888'

然后在visual studio同步就出问题了:

1
2
3
4
5
6
7
8
9
10
正在打开存储库:
C:\Users\She11c4T\Source\Repos\codeLearn
From https://github.com/Ma5ker/codeLearn
= [up to date] master -> origin/master
发布到远程存储库时遇到错误: Git failed with a fatal error.
NotSupportedException encountered.
ServicePointManager ��֧�־��� socks5 �����Ĵ����
cannot spawn /c/program files (x86)/microsoft visual studio/2019/enterprise/common7/ide/commonextensions/microsoft/teamfoundation/team explorer/Git/mingw32/libexec/git-core/git-askpass.exe: No such file or directory
could not read Username for 'https://github.com': terminal prompts disabled
Pushing to https://github.com/Ma5ker/codeLearn.git

最骚的是错误还分为两个部分,这就很有意思了。

1
2
3
4
NotSupportedException encountered.
ServicePointManager ��֧�־��� socks5 �����Ĵ����
...
could not read Username for 'https://github.com': terminal prompts disabled

首先呢,是一个疑似代理不支持的错误,提示信息还部分乱码,在网上找了好久之后发现了错误的完整信息。

1
2
fatal: NotSupportedException encountered.
ServicePointManager 不支持具有 socks5 方案的代理。

根据博主描述,这个问题可能在三个方面:

1
2
3
配置了本地的 socks5 的代理(Shadowsocks 之类的代理软件)
配置了远程服务器 Git 服务端的 SSH
本地提交代码到远程服务器时使用的是 http/https 协议

于是乎我大概懂得了这两个错误的原因。

我在clone到本地时使用的是https,这个可以从visual studio的设置部分看到。由此导致了使用socks5代理错误,然后不知为何,在发生错误后,visual studio好像再次试图通过https访问,但是未读取到我的用户名,也不知是代理导致的网络问题,还是其他的错误。

解决方法

这个问题有两个解决办法,就是两种git clone的方式而已。

使用ssh代理

生成公私钥,然后配置github的ssh密钥访问,在visual studio中clone时填入ssh的url,就是git开头的那个。代理配置socks5://即可。

注意这里有个问题,代理可不是跟原来一样设置http.proxy,原来的设置只是http和https的代理而已,这里需要设置ssh的代理,创建并修改C:\Users\用户名\.ssh\config文件以添加ssh代理配置(这里只是针对github,如果是全局的话,可以去掉Host的限制):

1
2
Host github.com
ProxyCommand "C:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:8888 %h %p

这样就搞定了ssh代理配置。

使用http代理

使用http代理就很简单了。clone库时选择https的url,代理需要更换为http://的代理,就是我之前设置的那样,只不过将socks5协议换成http

1
2
git config --global http.proxy 'http://127.0.0.1:8889'
git config --global https.proxy 'http://127.0.0.1:8889'

芜湖,起飞。