git fsck提示Cannot fix broken link 无法修复git损坏链接求助
Git损坏tree对象坏链修复方案
方案一:从其他完整副本恢复损坏对象(优先推荐,无数据损失)
- 如果你有该仓库的远程克隆地址,或者其他同事/设备上存储的该仓库的完整副本,优先用该方案恢复损坏对象:
- 到完整副本的仓库目录下执行:
git cat-file -p 9a684a736e3b97ff7c709138259196fd223e661c > 9a684a_tree.bin - 将导出的
9a684a_tree.bin文件复制到损坏仓库的根目录,执行以下命令导入对象:git hash-object -w -t tree 9a684a_tree.bin - 执行
git fsck校验,确认对象损坏报错消失后,即可正常执行git pull等操作。
- 到完整副本的仓库目录下执行:
方案二:无完整副本时修剪坏提交
如果找不到任何包含该损坏对象的完整副本,需要删除引用损坏tree的提交来修复:
- 第一步:查询坏提交的父提交哈希,执行:
输出结果中第二个哈希值即为该坏提交的父提交哈希,记为git log --pretty=format:"%H %P" | grep fca8efc10a91c7ac2cd0acf5d6744c1cb1ea9765父提交哈希 - 第二步:处理分支引用:
所有操作前建议先备份整个
.git目录,避免操作失误导致数据丢失- 如果不需要保留坏提交及之后的提交,执行:
git reset --hard 父提交哈希 - 如果需要保留坏提交之后的所有提交,执行:
git rebase --onto 父提交哈希 fca8efc10a91c7ac2cd0acf5d6744c1cb1ea9765 你的分支名,将坏提交之后的提交直接移植到父提交上
- 如果不需要保留坏提交及之后的提交,执行:
- 第三步:清理无效引用和缓存,依次执行以下命令:
git reflog expire --expire=now --all git gc --prune=now --aggressive - 第四步:执行
git fsck校验,确认无损坏对象报错后,即可从远程拉取最新代码。
注意事项
- 如果坏提交存在于多个分支,需要对每个引用了该提交的分支都执行对应的重置/变基操作
- 操作完成后建议再次执行
git fsck全量校验,确认所有对象链正常
内容的提问来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

