653 字
3 分钟
Git上传时长时间未结束问题
问题描述
刚刚用git push
将本地仓库的commit推送到远程仓库,但是等了半天也也没有正常结束,终端里显示的内容如下:
❯ git pushEnumerating objects: 30, done.Counting objects: 100% (30/30), done.Delta compression using up to 16 threadsCompressing objects: 100% (29/29), done.Writing objects: 100% (29/29), 129.62 KiB | 902.00 KiB/s, done.Total 29 (delta 2), reused 0 (delta 0), pack-reused 0# 停在这里了,没有正常结束
判断哪个步骤出现问题
git push
的执行阶段:
- 本地准备阶段
- 计算差异对象(显示
Counting objects
) - 压缩数据(显示
Compressing objects
)
- 计算差异对象(显示
- 网络传输阶段
- 上传数据包(显示
Writing objects
和进度百分比)
- 上传数据包(显示
- 远程更新阶段
- 更新远程引用(显示
Updating references
)
- 更新远程引用(显示
我这里是卡在了远程更新阶段,Git 正在等待远程服务器确认并更新分支指针,等了大概10分钟,基本确认没办法正常结束了
解决过程
首先尝试安全中断
kill -SIGTERM $(pgrep git)
# 也可以通过ps aux | grep -i git先获取git进程的进程id# 再kill -SIGTERM <git进程ID>
# 输出如下:[1] 186152 terminated git pushgitstatus_query_p9k_:print:68: write error: broken pipe❯gitstatus_query_p9k_:print:68: write error: broken pipe❯gitstatus_query_p9k_:print:68: write error: broken pipe
提示broken pipe
,管道破裂错误,通常发生在:
- 一个进程尝试写入已关闭的管道
- 终端突然关闭
- 命令被中断
我这里先检查一下本地对象完整性
git fsck
# 输出如下,说明git仓库中有一些悬空对象❯ git fsckChecking object directories: 100% (256/256), done.Checking objects: 100% (911/911), done.dangling blob 1cb6fd942e97b87b9d02f692b32e535ebbcd90e4dangling blob 3bd9bce7058fdf7b9809c5a87053a5270c6a75eadangling blob 455b36eb1a68c7d657db51ed3538cd6fcd96e8e0dangling blob c7dc989f8044a4fcf16361414998e14694e1ac7e
- 什么是悬空对象:
- 这些是存在于你的 Git 数据库(.git/objects)中,但没有任何分支、标签或其他引用指向它们的对象
- 它们不再是你当前项目历史的一部分
- 为什么会产生:
- 最常见的原因是:
- 使用了
git add
但后来撤销了(如git reset
) - 进行了变基(rebase)或修改历史操作
- 强制推送后丢弃的提交
- 中断的 Git 操作
- 使用了
- 最常见的原因是:
- 这些 blob 是什么:
- blob 是 Git 存储文件内容的基本单位
- 这些可能是你曾经暂存但未提交的文件内容
通过git show <blog hash>
来查看悬空对象的实际内容,发现四个文件都是已经删除的废弃文件,说明本地对象完整性没有问题
清理远程失效引用
git remote prune origin
然后清理可能残留的进程
pkill -f "git-remote-https"
再启用详细日志重新推送到服务器
GIT_TRACE=1 GIT_TRACE_PACKET=1 git push --verbose
Git上传时长时间未结束问题
https://fuwari.cbba.top/posts/git上传时长时间未结束问题/