如何彻底删除Git本地仓库中损坏且无法恢复的blob对象?
Git损坏blob清除及历史回退操作指南
方案1:抹除问题提交及后续所有提交(适配你需要回到问题blob产生前状态、手动修复后续内容的需求)
- 执行
git log --oneline,定位到引入损坏blob的提交之前的最后一个正常提交的哈希值,记为<正常提交哈希> - 执行硬重置命令,将当前分支完全回退到该正常提交状态:
git reset --hard <正常提交哈希> - 执行以下命令清理Git数据库中的悬空对象(你之前执行reset后损坏blob仍存在,是因为Git默认会保留reflog记录和近期悬空对象,需要手动触发强制垃圾回收):
git reflog expire --expire=now --all git gc --prune=now --aggressive
- 执行
git fsck验证,无损坏blob相关报错即操作完成,此时.git目录下的Git数据库已完全回到问题blob被创建之前的状态。
方案2:保留问题提交之后的有效提交内容(适配后续提交有可复用内容的场景)
- 先定位两个提交哈希:问题blob引入前的正常提交哈希
<正常提交哈希>、引入损坏blob的问题提交哈希<问题提交哈希> - 执行交互式变基命令:
git rebase -i <正常提交哈希> - 在弹出的编辑界面中,将
<问题提交哈希>对应行开头的pick修改为drop,保存退出后变基会自动执行,抹除问题提交的同时保留后续提交内容 - 执行方案1中的强制垃圾回收命令,清除悬空的损坏blob,再用
git fsck验证即可。
内容的提问来源于stack exchange,提问作者Oliver Richter
相关产品推荐
相关产品推荐

