SourceTree Push 卡住/失败排查指南
SourceTree 在推送(Push)代码时进度条“一直不动”或直接报错,通常有以下几个主要原因。请按照顺序进行排查。
1. 核心怀疑对象:大文件 (Large Files)
这是最常见的原因。如果你的提交中包含 超过 100MB(对于 GitHub)或 超过 50MB 的单一文件,Push 过程会非常慢,甚至直接被服务器拒绝。
现象
- 进度条长时间停留在某个百分比。
- 最终报错:
remote: error: GH001: Large files detected.(GitHub 典型报错)。 - 报错信息包含:
RPC failed; result=22, HTTP code = 413。
解决方案 A:如果是误传的大文件(不需要的文件)
如果你不小心把 node_modules、.zip、.mp4 或巨大的数据库文件提交了,仅仅在文件夹里删除它是没用的,因为它已经存在于你的本地 Git 提交历史(Commit History)里了。
你必须“撤销”那个提交:
-
软重置 (Soft Reset):
在 SourceTree 中,右键点击上一次成功 Push 的那个版本,选择“重置当前分支到此次提交” -> 选择 “混合 (Mixed)” 或 “软 (Soft)” 模式。
- 这会把你的改动保留在工作区,但撤销掉“提交”动作。
-
删除大文件: 在文件列表中找到那个大文件,删除它,或者将其添加到
.gitignore。 -
重新提交: 再次 Commit 并 Push。
解决方案 B:如果必须上传大文件
如果你确实需要上传大文件(比如游戏开发资源、大模型权重):
- 你需要使用 Git LFS (Large File Storage) 。
- 安装 LFS: 打开终端输入
git lfs install。 - 追踪文件:
git lfs track "*.psd"(将后缀换成你的大文件类型)。
2. 必须做的第一步:使用命令行查看真相
SourceTree 有时候会把错误信息“吞掉”或者只显示通用的“Failed”。最直接的诊断方法是打开终端(Terminal / Git Bash)。
在 SourceTree 右上角点击“终端”按钮,输入:
git push
观察终端输出的错误信息:
- 如果是
Time out-> 网络问题。 - 如果是
File too large-> 参考上面的大文件方案。 - 如果是
403 Forbidden-> 权限/密码/Token 问题。
3. 常见技术原因:HTTP 缓存太小
Git 默认的 HTTP 传输缓存较小,如果一次性 Push 的改动较多(哪怕不是单个大文件,而是很多小文件),也容易卡死。
解决方案
在终端中执行以下命令,将缓存增加到 500MB:
git config --global http.postBuffer 524288000
(执行完后尝试重新 Push)
4. 针对报错 curl 52 Empty reply from server 的进阶修复
这是你遇到的具体报错。 它意味着服务器在传输完成前切断了连接。除了增加缓存(第3步),你还需要告诉 Git 不要因为网速慢就切断连接。
解决方案
在终端中依次执行以下两条命令,增加 Git 对低速传输的容忍时间:
# 设置最低速度限制为 0(即不限速)
git config --global http.lowSpeedLimit 0
# 设置低速容忍时间为 999999 秒(防止超时)
git config --global http.lowSpeedTime 999999
执行完这两条命令后,再次尝试 git push。
5. 终极方案:切换到 SSH 协议 (推荐)
如果你的报错日志是 Pushing to https://... 且一直报 curl 52 或 RPC failed,最彻底的解决办法是放弃 HTTPS,改用 SSH。SSH 协议在传输大文件和应对网络波动时比 HTTPS 稳定得多。
操作步骤
-
生成 SSH Key (如果还没生成过):
在终端输入 ssh-keygen -t rsa -C "your_email@example.com",一路回车。
-
在代码托管平台添加 Key:
复制公钥内容 (cat ~/.ssh/id_rsa.pub),去阿里云 Codeup/GitHub 的设置页面 -> "SSH 公钥" -> 添加。
-
修改仓库地址:
在 SourceTree 中 -> "仓库" -> "仓库设置" -> "远程仓库" -> 编辑 origin。
将 URL 从 codeup.aliyun.com/.../repo.gi… 改为 git@codeup.aliyun.com:.../repo.git。
-
重新 Push。
6. 网络与代理问题 (VPN)
如果你在国内访问 GitHub/GitLab,网络波动会导致 SSL 握手失败或传输中断。
解决方案
-
开启 VPN: 确保你的网络能顺畅访问远程仓库。
-
配置 Git 代理 (如果你开了 VPN 但 Git 不走代理):
假如你的 VPN 端口是 7890 (请在你的 VPN 软件设置里查看):
git config --global http.proxy [http://127.0.0.1:7890](http://127.0.0.1:7890) git config --global https.proxy [http://127.0.0.1:7890](http://127.0.0.1:7890) -
取消代理 (如果代理配置乱了):
git config --global --unset http.proxy git config --global --unset https.proxy
7. 这种时候该怎么办?(总结操作流程)
- 不要干等: 如果进度条 5 分钟不动,直接点取消。
- 看日志: 打开 SourceTree 的命令行模式,输入
git push看具体报错。 - 设缓存与超时: 运行本文第 3 和 第 4 点的命令。
- 查文件: 检查最近一次 Commit 里有没有几百兆的视频、压缩包或库文件。如果有,用“重置 (Reset)”大法撤销那次提交,把大文件删掉再推。