最近在使用github拉取和推送项目时,经常会遇到FATAL: unable to access https://xxxxxxxxxxxxxxxx.git/: Recv failure: Connection was reset或Failed to connect to github.com port 443这类报错,尤其是在git push时,几乎无法完成push。这种情况可以尝试以下三种方法解决

#代理git的http/https请求

github远程请求的协议主要是https和SSH,所以这里要做的是对git命令的https流量做代理
git代理有两种设置方式,分别是全局代理和只对github代理,建议只对github代理
代理协议有两种,分别是使用http代理和使用socks5代理,这里演示http代理

注意 : 下面代码的端口号请根据自己实际的代理端口号填写,比如我的代理http端口是10809

本地代理http端口

全局代理

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

# 使用socks5代理
git config --global http.proxy socks5://127.0.0.1:10809
git config --global https.proxy socks5://127.0.0.1:10809

只对github代理

1
2
3
4
5
# 使用http代理
git config --global http.https://github.com.proxy http://127.0.0.1:10809

# 使用socks5代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:10809

取消代理

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

设置完成后,进入用户名根路径C:\Users\用户名,查看.gitconfig 文件,如下图所示即为完成设置

github http代理

#切换SSH连接

检查本机是否安装SSH key

在git bash客户端运行

1
2
cd ~/.ssh
ls

若结果没有id_rsa、id_rsa.pub这两个文件,则创建新的SSH key;若有,则进入步骤3,将SSH key添加到github

创建新的SSH key

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

在命令提示符或 PowerShell 中执行以上命令,若遇到询问,全部enter,若没有报错并显示identification、public key、key fingerprint等信息,则说明创建成功

注意 : 此处设置的邮箱若与你的github账号设置的private email相同,则需要登陆github账号,前往settings->emails取消勾选下列选项

uncheck item

添加SSH key到github

到C:\Users\用户名.ssh目录下,使用编辑器打开id_rsa.pub文件并copy里面的内容;
登陆github账号,依次点击settings->SSH and GPG keys->new SSH key,将copy的内容粘贴至key栏,title随便填,key type选Authentication Key,确认无误后点击Add SSH key

验证是否配置成功

1
ssh -T git@github.com

若提示You’ve successfully authenticated字样则表示成功

切换本地仓库连接协议

SSH连接配置成功后,前往仓库->code,copy SSH链接,然后在本地clone;
或者在本地仓库根目录下打开power shell运行以下命令,将远程https链接更改为SSH链接

1
git remote set-url origin git@github.com:xxxx/xxxx.git

执行以下命令来验证远程 URL 是否已成功更改为 SSH 形式

1
git remote -v

#Github Desktop!

如果你使用SSH能正常连接到github的话,那么最简单的就是下载并安装Github Desktop,默认设置就是SSH,无需配置!至于SSH连接不上github该怎么办,由于暂时还没发生,暂不讨论。完!