You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令,问题未解决。

可能原因分析

  1. 隐藏大文件残留:项目当前体积虽小,但Git历史中可能存在已删除的大文件(如日志、缓存、安装包等),推送时需要传输这些历史对象,导致耗时剧增。
  2. 网络连接异常:本地网络带宽极低、不稳定,或远程仓库服务器负载过高,导致对象传输速率被限制。
  3. Git对象库损坏:git gc未彻底修复损坏的对象,推送时需要反复处理错误对象。
  4. 重基冗余对象: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:45:32