Git Bash已有项目小改动推送极慢问题排查与解决
Git Push卡在"Writing Objects"阶段(小项目大耗时)的排查与解决
问题场景
对一个仅900KB的已有项目提交小改动,执行常规Git命令:
git add . git add -u git commit -m "changes" git pull --rebase git push -u origin main
此前推送流程正常,但此次卡在Writing objects阶段超25分钟,最终耗时近1小时完成,推送过程输出如下:
Enumerating objects: 28, done. Counting objects: 100% (28/28), done. Delta compression using up to 8 threads Compressing objects: 100% (16/16), done. Writing objects: 94% (16/17), 31.66 MiB | 15.00 KiB/s
已尝试git config --global http.postBuffer 157286400和git gc命令,问题未解决。
可能原因分析
- 隐藏大文件残留:项目当前体积虽小,但Git历史中可能存在已删除的大文件(如日志、缓存、安装包等),推送时需要传输这些历史对象,导致耗时剧增。
- 网络连接异常:本地网络带宽极低、不稳定,或远程仓库服务器负载过高,导致对象传输速率被限制。
- Git对象库损坏:
git gc未彻底修复损坏的对象,推送时需要反复处理错误对象。 - 重基冗余对象:
git pull --rebase操作产生了冗余提交对象,增加了推送时的传输量。
对应解决方案
1. 清理Git历史中的大对象
- 定位仓库内体积最大的历史对象:
git rev-list --all --objects | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')" - 使用
git filter-repo彻底移除大文件(替代已废弃的git filter-branch):# 替换为实际大文件路径 git filter-repo --path path/to/large/file --invert-paths # 强制推送清理后的历史(共享仓库需通知协作者重新拉取) git push origin main --force
2. 排查并优化网络连接
- 切换网络环境:尝试有线网络或手机热点,排除本地带宽限制。
- 改用SSH协议推送(比HTTP/HTTPS更稳定):
# 替换为你的SSH格式远程地址 git remote set-url origin git@<repo-host>:<username>/<repo-name>.git - 确认远程仓库服务器状态:私有仓库检查服务器负载,公共仓库查看官方状态页面确认服务正常。
3. 修复Git对象库
- 执行完整的对象库检查:
git fsck --full - 若发现损坏对象,从远程拉取修复:
git fetch origin main --depth=1 git fsck --full - 极端情况下重新初始化本地仓库(先备份
.git目录):# 备份.git目录 cp -r .git ../repo-backup.git # 重新初始化并关联远程 git init git remote add origin <原远程仓库地址> git fetch origin main git reset --hard origin/main # 重新提交本地改动 git add . git commit -m "restore changes" git push origin main
4. 清理重基产生的冗余对象
- 查看分支提交历史,确认冗余提交:
git log --oneline --graph - 交互式重基合并冗余提交:
# 调整数字为需要处理的最近提交数量 git rebase -i HEAD~5 # 在编辑器中用squash/fixup标记需要合并的提交 - 彻底清理本地未引用对象:
git gc --aggressive --prune=now
内容的提问来源于stack exchange,提问作者takakazu abe
相关产品推荐
相关产品推荐

