本文最后更新于:2026年4月17日 晚上

在国内服务器上开发时,git push 突然超时,SSH/HTTPS 全部连不上 GitHub。本文记录从诊断到修复的完整过程,核心原因是本地有 Clash 代理但 Git 和 SSH 没有配置使用它。

问题现象

git push 卡住直到超时:

1
2
3
$ git push origin main
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.

逐步排查

1. 确认 Remote 和分支状态

1
2
3
4
5
6
$ git remote -v
origin git@github.com:xxx/xxx.git (fetch)
origin git@github.com:xxx/xxx.git (push)

$ git branch -vv
* main fac17aa [origin/main: ahead 50] feat: ...

远程地址是 SSH 协议,本地 ahead 50 个 commit,需要 push。

2. 测试 SSH 连接

1
2
$ ssh -T git@github.com -o ConnectTimeout=10
ssh: connect to host github.com port 22: Connection timed out

SSH 端口 22 超时。尝试 443 端口(参考前文):

1
2
$ ssh -T -p 443 git@ssh.github.com -o ConnectTimeout=10
ssh: connect to host ssh.github.com port 443: Connection timed out

443 也超时,说明不是简单的端口封禁问题。

3. 测试 HTTPS 和 Ping

1
2
3
4
5
$ curl -s --connect-timeout 10 -o /dev/null -w "HTTP %{http_code} in %{time_total}s\n" https://github.com
HTTP 000 in 10.002881s

$ ping -c 2 -W 3 github.com
2 packets transmitted, 0 received, 100% packet loss

GitHub 完全不可达。国内网络验证正常:

1
2
$ curl -s --connect-timeout 10 -o /dev/null -w "HTTP %{http_code} in %{time_total}s\n" https://www.baidu.com
HTTP 200 in 0.234748s

结论:GitHub 被网络环境完全阻断。

4. 寻找本地代理

1
2
$ ss -tlnp | grep -E ':(1080|7890|7891|10808|10809)'
LISTEN 0 4096 127.0.0.1:7890 0.0.0.0:* users:(("clash-linux",pid=7459,fd=10))

Clash 在 127.0.0.1:7890 运行。验证代理能否访问 GitHub:

1
2
$ curl -s --connect-timeout 5 -x http://127.0.0.1:7890 -o /dev/null -w "HTTP %{http_code} in %{time_total}s\n" https://github.com
HTTP 200 in 3.519280s

HTTP 代理可用。

修复方案

需要配置两层代理:Git HTTPS 代理 + SSH over 代理。

1. 配置 Git HTTP/HTTPS 代理

适用于 HTTPS 协议的 remote(https://github.com/...):

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

2. 配置 SSH 走代理

当前 remote 是 SSH 协议(git@github.com:...),SSH 不走 http.proxy,需要额外配置。

编辑 ~/.ssh/config,在文件顶部添加:

1
2
3
4
Host github.com
HostName github.com
User git
ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=7890

注意:需要系统安装 socat。如果没有可以用 nc(netcat)替代:

1
ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p

如果都没有,Ubuntu 上安装:sudo apt install socat

3. 验证与推送

1
2
3
4
5
6
$ ssh -T git@github.com -o ConnectTimeout=15
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.

$ git push origin main
To github.com:xxx/xxx.git
7687894..fac17aa main -> main

推送成功。

补充说明

  • 取消代理:如果之后网络环境变化不需要代理了,清除配置:
1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

然后删除 ~/.ssh/config 中的 Host github.com 块即可。

  • 仅对 GitHub 生效:上述 SSH 配置仅对 github.com 域名生效,不影响其他 SSH 连接。

  • SOCKS5 vs HTTP:经测试当前 Clash 的 SOCKS5 端口不可用(socks5://127.0.0.1:7890 超时),只有 HTTP 代理端口可用,实际使用时需确认自己代理工具的有效端口和协议。

参考资料



文章链接:
https://www.zywvvd.com/notes/tools/git/git-proxy-clash/git-proxy-clash/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理
https://www.zywvvd.com/notes/tools/git/git-proxy-clash/git-proxy-clash/
作者
Yiwei Zhang
发布于
2026年4月17日
许可协议