2026-10-16 · 解法 · 部署
GitHub Pages
在国内网络下怎么发布
克隆卡在 0 字节、SSH 说「认证成功」却推不动、命令超时——这三种症状我们一天里全遇上了。 下面是最后跑通的那套做法,可以直接照抄。
先看症状属于哪一种
| 症状 | 真正的原因 |
|---|---|
SSH 提示 successfully authenticated,但推送失败 | 域名被本地代理接管,认证是假的 |
git clone 卡住,objects/pack 一直是 0 字节 | 握手能过,数据传输被切断 |
ls-remote 秒回、clone 不动 | 同上,参考广告能读,大包传不动 |
| 过一会儿又能用了 | 网络本身断续,不是配置错 |
第 0 步:先验证「认证成功」是真的
这一步能省掉最多时间。生成一把注定不该成功的密钥去试:
ssh-keygen -t ed25519 -N "`"`"" -f %TEMP%\probe
ssh -i %TEMP%\probe -o IdentitiesOnly=yes -T git@github.com
如果它也回你 successfully authenticated,那这个入口就不是真的 GitHub——
你后面所有「成功」都不算数。真入口用官方密钥重测,并且用 API 交叉核对一次提交哈希。
第 1 步:改用 443 端口的 SSH 入口
GitHub 为受限网络提供了 SSH-over-443,这是最可用的通道:
$env:GIT_SSH_COMMAND = '"C:/Windows/System32/OpenSSH/ssh.exe" -p 443 -o StrictHostKeyChecking=accept-new -o BatchMode=yes -o ConnectTimeout=15'
git ls-remote ssh://git@ssh.github.com:443/<用户名>/<用户名>.github.io.git
注意 GIT_SSH_COMMAND 里的路径要用正斜杠——这个字符串会被 sh 解析,
反斜杠会被吃掉(我们为此白折腾了一轮)。
第 2 步:浅克隆
完整克隆的包协商很容易挂在那里。只需要最新一个提交的话:
git clone --depth 1 --single-branch --branch main \
ssh://git@ssh.github.com:443/<用户名>/<用户名>.github.io.git
我们这边:完整克隆二十分钟不动,浅克隆 5 秒、6.2 MB 结束。提交完照样能推送。
第 3 步:把重试写进脚本
网络断续是常态,不是异常。推送失败就等 10 秒重试,最多五次;同时给 ssh 加上
-o ServerAliveInterval=10 -o ServerAliveCountMax=6,避免连接被静默掐断。
备用通道:完全不依赖 git 传输
如果 443 也被挡,还有一条路:用 GitHub 的 REST API 直接提交。它只需要能打开
api.github.com(HTTPS),一个文件对应一次调用:
建 blob → 建 tree(把远端当前 tree 作为 base_tree,这样没动的文件自动保留)→
建 commit → 移动分支 ref。需要一个只有该仓库 Contents: Read and write 权限的令牌。
抓一次线上页面,和本地文件逐字比对。命令没报错只说明它跑完了。
这套做法的由来(含假认证的完整推理过程):《上线实录 ① 一个骗过我的 127.0.0.1》。 回到笔记