经常发现,自己虽然有梯子,可以正常访问github页面,但是在发现“git clone”命令速度特别慢,有时还经常卡掉。本文通过设置git 代理,解决被墙问题。
着急的同学直接看第三节-设置ssh代理(终极解决方案)

前置要求

  • 首先你得一个可用的梯子(代理)
  • 其次,确认你的梯子的代理端口号

比如我用的trojan,在常规设置一栏可以看到Socks5端口号为51837,Http端口号为58591,记下这两个端口号,之后要用到。

img

git 有几种传输协议,在Github上主要用到的是HttpsSSH协议。所以我们要做的是对git 命令的https 以及ssh流量做代理。

img

设置https 代理

Git代理有两种设置方式,分别是全局代理和只对Github代理,建议只对github 代理。
代理协议也有两种,分别是使用http代理和使用socks5代理,建议使用socks5代理。
注意下面代码的端口号需要根据你自己的代理端口设定,比如我的代理socks端口是51837。

全局设置(不推荐)

1
2
3
4
5
6
#使用http代理 
git config --global http.proxy http://127.0.0.1:58591
git config --global https.proxy https://127.0.0.1:58591
#使用socks5代理
git config --global http.proxy socks5://127.0.0.1:51837
git config --global https.proxy socks5://127.0.0.1:51837

只对Github代理(推荐)

1
2
3
4
#使用socks5代理(推荐)
git config --global http.https://github.com.proxy socks5://127.0.0.1:51837
#使用http代理(不推荐)
git config --global http.https://github.com.proxy http://127.0.0.1:58591

取消代理
当你不需要使用代理时,可以取消之前设置的代理。

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

设置ssh代理(终极解决方案)

https代理存在一个局限,那就是没有办法做身份验证,每次拉取私库或者推送代码时,都需要输入github的账号和密码,非常痛苦。
设置ssh代理前,请确保你已经设置ssh key。

1、检查是否已经有 SSH key

运行 git Bash 客户端,输入如下代码:

1
2
3
4
1
2
cd ~/.ssh
ls

这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3

2、创建新的 SSH key

1
2
1
ssh-keygen -t rsa -C "your_email@example.com"

代码参数含义:

  • -t 指定密钥类型,默认是 rsa ,可以省略。
  • -C 设置注释文字,比如邮箱。
  • -f 指定密钥文件存储文件名。

以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:

1
2
3
4
1
2
Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]

当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsaid_rsa.pub 两个秘钥文件。

接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),

当然,你也可以不输入密码,直接按回车(推荐)。那么push的时候就不需要输入密码,直接提交到github上了,如:

1
2
3
4
1
2
Enter passphrase (empty for no passphrase):
# Enter same passphrase again:

接下来,就会显示如下代码提示,如:

1
2
3
4
5
6
7
8
1
2
3
4
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

当你看到上面这段代码就说明,你的 SSH key 已经创建成功,你只需要添加到github的SSH key上就可以了。

image-20210405213257970

创建成功

3、添加 SSH key 到 github

  • 首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制。

img

  • 登录你的github账号,从右上角的设置( Settings )进入,然后点击菜单栏的 SSH and GPG keys 进入页面。
  • 点击 Add SSH key 按钮添加一个 SSH key 。把你复制的 SSH key 代码粘贴到 key 所对应的输入框中,记得 SSH key 代码的前后不要留有空格或者回车。上面的 Title 所对应的输入框你也可以输入一个该 SSH key 显示在 github 上的一个别名,也可以不输入,默认会使用你的邮件名称。

img

4、验证是否配置成功

1
2
1
ssh -T git@github.com

成功的话如下所示

image-20220310160828315

之后都推荐走ssh拉取代码,再github 上选择clone地址时,选择ssh地址,入下图。这样git pushgit clone 都可以直接走代理了,并且不需要输入密码。

image-20220310155659787

更进一步是设置ssh代理。只需要配置一个config就可以了。

1
2
3
4
# Linux、MacOS
vi ~/.ssh/config
# Windows
到C:\Users\your_user_name\.ssh目录下,新建一个config文件(无后缀名)

将下面内容加到config文件中即可

对于windows用户,代理会用到connect.exe,你如果安装了Git都会自带connect.exe,如我的路径为C:\APP\Git\mingw64\bin\connect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Windows用户,注意替换你的端口号和connect.exe的路径
ProxyCommand "C:\APP\Git\mingw64\bin\connect" -S 127.0.0.1:51837 -a none %h %p

#MacOS用户用下方这条命令,注意替换你的端口号
#ProxyCommand nc -v -x 127.0.0.1:51837 %h %p

Host github.com
User git
Port 22
Hostname github.com
# 注意修改路径为你的路径
IdentityFile "C:\Users\Your_User_Name\.ssh\id_rsa"
TCPKeepAlive yes

Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
# 注意修改路径为你的路径
IdentityFile "C:\Users\Your_User_Name\.ssh\id_rsa"
TCPKeepAlive yes

保存后文件后测试方法如下,返回successful之类的就成功了。

1
2
# 测试是否设置成功
ssh -T git@github.com

之后都推荐走ssh拉取代码,再github 上选择clone地址时,选择ssh地址,入下图。这样git pushgit clone 都可以直接走代理了,并且不需要输入密码。

img

原理部分

代理服务器就是你的电脑和互联网的中介。当您访问外网时(如http://google.com) , 你的请求首先转发到代理服务器,然后代理服务器替你访问外网,并将结果原封不动的给你的电脑,这样你的电脑就可以看到外网的内容啦。
路径如下:

你的电脑->代理服务器->外网
外网->代理服务器->你的电脑

很多朋友配置代理之后,可以正常访问github 网页了,但是发现在本地克隆github仓库(git clone xxx)时还是报网络错误。那是因为git clone 没有走你的代理,所以需要设置git走你的代理才行。