GitHub Desktop 推送失败?SSH 走 443 端口,国内不翻墙也能推

最近用 GitHub Desktop 往 GitHub 推代码,每次都卡在"推送中……"然后超时失败。不想为了这点事去开 VPN,于是花了一晚上把问题彻底解决。下面把完整排查和方案记下来,既怕自己以后忘了,也希望能帮到同样被墙内网络折磨的人。
先别急着改,判断"到底为什么失败"
很多人一上来就搜"GitHub 推送失败",答案五花八门。其实失败原因只有两类,对症才有效:
- 网络类:超时、
Failed to connect、长时间无响应。这是大陆访问 GitHub 不稳定的典型表现。 - 认证类:
403、Authentication failed,或弹窗要你输密码却怎么都不对。GitHub 早就不支持账号密码登录了,必须用 Personal Access Token 或 SSH Key。
我的情况是网络类——连都连不上,谈何认证。所以方向是"把通道打通"。
为什么选"SSH 走 443"而不是别的
常见办法有好几种:配代理、改 hosts、用镜像中转(各种 ghproxy)、走第三方代码托管同步……但这些要么依赖额外工具,要么有稳定性或安全顾虑。
最终选了 SSH over 443,理由是:
- 443 端口几乎不会被封(它本来就是 HTTPS 端口,防火墙一般放行);
- 一次性配置,永久生效,不依赖任何代理软件;
- 零"后遗症":只是在本机改了个 SSH 配置文件,不影响系统其他部分,随时可删。
GitHub 官方本身提供了 ssh.github.com:443 这个备用端点,所以这不是野路子,是正经官方方案。
实操五步(命令可直接复制)
第 1 步:让 github.com 走 443
新建(或编辑)本机文件 ~/.ssh/config,写入:
# GitHub over HTTPS port 443
Host github.com
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
保存后设一下权限(SSH 对权限很挑剔):
chmod 600 ~/.ssh/config
这一段只对你连接 github.com 时生效,其它 SSH 连接完全不受影响。
第 2 步:生成一对专用于 GitHub 的密钥
如果之前只用 HTTPS + Token,那本机八成没有给 GitHub 用的 SSH 密钥。生成一对:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_github -N "" -C "你的备注名"
-N "" 表示不设密码,GitHub Desktop 用起来最省事。生成后会有两个文件:私钥 id_ed25519_github(留本机)和公钥 id_ed25519_github.pub(要上传的那一个)。
第 3 步:把公钥贴到 GitHub
打开公钥文件,复制里面整行内容(形如 ssh-ed25519 AAAA…… 你的备注名)。
到 GitHub 网站 → 头像 → Settings → SSH and GPG keys → New SSH key,粘进去、起个名字(比如 My-Mac),保存。
第 4 步:把仓库远程地址从 https 改成 ssh
关键坑来了:上面这套 443 配置只对 SSH 格式的远程地址生效。 如果仓库远程还是 https://github.com/...,它根本不会走 SSH,自然也用不上 443。
在仓库目录里执行:
git remote set-url origin git@github.com:你的用户名/你的仓库名.git
(本质就是把 https://github.com/ 换成 git@github.com:,并把后面的 / 改成 :)
如果有一堆仓库,可以写个小循环批量改(只动 github.com 的 https 地址):
for repo in 你的仓库父目录/*/; do
if git -C "$repo" remote get-url origin 2>/dev/null | grep -q "https://github.com"; then
git -C "$repo" remote set-url origin \
$(git -C "$repo" remote get-url origin | sed 's#https://github.com/#git@github.com:#')
fi
done
提示:这个配置对
origin和upstream都有效,公开的上游仓库用 SSH 做只读拉取也没问题。
第 5 步:验证
ssh -T git@github.com
如果看到 Hi 你的用户名! You've successfully authenticated.,恭喜,通道打通了。之后在 GitHub Desktop 里直接 Push 即可。
我踩过的两个坑
- 坑一:只改了端口,忘了加密钥。 第一次测
ssh -T直接Permission denied (publickey)。别慌——这反而说明网络通了(已经连到 GitHub 了),只是它不认识你的机器。把公钥加上就好。 - 坑二:远程没改成 ssh。 配完 443 信心满满去推,结果还是卡。一看远程还是
https://……所以第 4 步千万别漏。
收尾清单
| 步骤 | 动作 | 验证标准 |
|---|---|---|
| 1 | 写 ~/.ssh/config 走 443 | 文件存在且权限为 600 |
| 2 | 生成 GitHub 专用密钥 | ~/.ssh/id_ed25519_github 存在 |
| 3 | 公钥贴到 GitHub | New SSH key 列表里能看到 |
| 4 | 远程改 ssh 格式 | git remote -v 显示 git@ 开头 |
| 5 | 验证连通性 | ssh -T 返回 Hi 用户名 |
这套方案不是"翻墙",只是把 SSH 的握手端口从被封的 22 换到放行的 443,全程只动本机一个文本文件,干净、可逆、无副作用。如果你也被 GitHub Desktop 的推送折磨,照着五步走,十分钟搞定。



发表评论