SourceTree 推送半天不动解决方法

69 阅读4分钟

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)里了。

你必须“撤销”那个提交:

  1. 软重置 (Soft Reset):

    在 SourceTree 中,右键点击上一次成功 Push 的那个版本,选择“重置当前分支到此次提交” -> 选择 “混合 (Mixed)” 或 “软 (Soft)” 模式。

    • 这会把你的改动保留在工作区,但撤销掉“提交”动作。
  2. 删除大文件: 在文件列表中找到那个大文件,删除它,或者将其添加到 .gitignore

  3. 重新提交: 再次 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 52RPC failed,最彻底的解决办法是放弃 HTTPS,改用 SSH。SSH 协议在传输大文件和应对网络波动时比 HTTPS 稳定得多。

操作步骤

  1. 生成 SSH Key (如果还没生成过):

    在终端输入 ssh-keygen -t rsa -C "your_email@example.com",一路回车。

  2. 在代码托管平台添加 Key:

    复制公钥内容 (cat ~/.ssh/id_rsa.pub),去阿里云 Codeup/GitHub 的设置页面 -> "SSH 公钥" -> 添加。

  3. 修改仓库地址:

    在 SourceTree 中 -> "仓库" -> "仓库设置" -> "远程仓库" -> 编辑 origin。

    将 URL 从 codeup.aliyun.com/.../repo.gi… 改为 git@codeup.aliyun.com:.../repo.git。

  4. 重新 Push。

6. 网络与代理问题 (VPN)

如果你在国内访问 GitHub/GitLab,网络波动会导致 SSL 握手失败或传输中断。

解决方案

  1. 开启 VPN: 确保你的网络能顺畅访问远程仓库。

  2. 配置 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)
    
  3. 取消代理 (如果代理配置乱了):

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

7. 这种时候该怎么办?(总结操作流程)

  1. 不要干等: 如果进度条 5 分钟不动,直接点取消。
  2. 看日志: 打开 SourceTree 的命令行模式,输入 git push 看具体报错。
  3. 设缓存与超时: 运行本文第 3 和 第 4 点的命令。
  4. 查文件: 检查最近一次 Commit 里有没有几百兆的视频、压缩包或库文件。如果有,用“重置 (Reset)”大法撤销那次提交,把大文件删掉再推。