为git设置代理解决远程仓库无法连接问题

由于一些众所周知的原因,国内直连GitHub经常会遇到一些问题。为git设置代理可以解决GitHub网页可以打开而git无法连接远程仓库的问题。

准备工作

  • 电脑可以正常打开GitHub
  • 本机有代理软件运行或局域网内有其他机器可以作为代理

这是本教程生效的前提。如果GitHub网页版无法打开请尝试魔法上网。

为git配置http代理

Windows平台中git默认不采用系统代理,因此即使打开了代理软件、浏览器可以访问GitHub,使用git连接GitHub远程仓库仍然可能会出现无法访问的情况。因此需要修改git的设置,为git配置代理。

Windows、Linux、Mac OS X平台git命令相同:

1
2
3
4
5
6
# 配置socks5代理
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
# 配置http代理
git config --global http.proxy 'http://127.0.0.1:1080'
git config --global https.proxy 'https://127.0.0.1:1080'

注意如下几点:

  • socks5和http两种协议由你使用的代理软件决定,不同软件对这两种协议的支持不一,如果不确定可以都尝试一下
  • 命令中的主机号(上面的127.0.0.1)是你使用的代理的主机号,如果代理软件运行在本机则填入127.0.0.1即可,否则填入代理主机IP
  • 命令中的端口号为代理软件或代理主机的监听IP,同样可以从代理软件配置中获得

也可以指定代理的作用域:

1
2
#只对github.com
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

取消代理:

1
2
#取消代理
git config --global --unset http.https://github.com.proxy

配置成功以后就可以使用https协议连接GitHub远程仓库了。

为git配置SSH代理

上面的方法配置git代理虽然可以连接GitHub远程仓库,但是只能使用https协议连接,一是每次都要输入密码比较麻烦,二是不如SSH连接使用密钥验证安全。GitHub也在寻求使用密钥全面替代密码验证1

因此可以修改系统SSH服务的配置来为git的SSH连接设置代理,绕过GFW的封锁。

Windows平台

Windows平台的git中预置了connect.exe,可以用来接管git的流量。可以通过修改本地SSH配置文件来更改git的代理设置。

Windows平台配置文件位于C:\Users\$USERNAME$\.ssh\config,其中USERNAME是你的用户名。

在文件中加入如下配置:

1
2
3
4
5
6
7
8
9
Host github.com *.github.com # 指定代理规则作用域
User git
Port 22 # 端口号
# 自己的私钥所在路径
IdentityFile "~\.ssh\id_rsa"
# SOCKS代理设置方法
ProxyCommand connect -S 127.0.0.1:7890 %h %p
# HTTPS代理设置方法
ProxyCommand connect -H 127.0.0.1:7890 %h %p

注意选择SOCKS还是HTTPS代理需要根据代理软件支持的协议而定。如果软件在本机运行,host设置为本机(127.0.0.1)即可,端口号则设置为代理软件的监听端口号。以Clash for Windows为例,此时监听端口号就是7890:

Linux/Mac OS X

类Unix系统更改配置比较简单,配置文件一般在~/.ssh/config下,在文件中添加:

1
2
3
4
5
6
7
8
Host github.com *.github.com
User git
Port 22
IdentityFile "~\.ssh\id_rsa"
# SOCKS代理
ProxyCommand nc -v -x 127.0.0.1:7890 %h %p
# HTTPS代理
ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=7890

系统配置的修改一般需要超级管理员权限

参考资料

[1] GitHub shifts away from passwords with security key support for SSH Git operations | ZDNet