4

我有一个损坏的 blob 对象,可以在这里看到

> git fsck --full
错误:无法解压 5426a4097ea6a3597a1674b0b7fa67f395006f2a 标头
错误:inflateEnd:流一致性错误(无消息)
致命:松散对象 5426a4097ea6a3597a1674b0b7fa67f395006f2a(存储在 .git/obj 中
ects/54/26a4097ea6a3597a1674b0b7fa67f395006f2a) 已损坏

git cat-file -t 542... 也有同样的错误无法解压头

我检查了其他机器,并且都有损坏的版本。

我完成了这个过程 - http://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/howto/recover-corrupted-blob-object.txt并将其缩小到特定的文件(Site.css)和日期范围(之前和之后的提交),但我无法重建更改以恢复文件,因为它是很长时间所做的一组相当大的更改的一部分ago:很久以前,我真的不在乎那段历史。

因为我现在有了之前和之后提交的哈希值,我可以做些什么来忘记那一点历史 - 有点像变基(尽管我想变基会失败 - 还没有尝试过!)

4

2 回答 2

4

看看git-replace手册页。替换机制允许您放入具有不同散列的新 blob 来替代旧散列。这可能对你有用。

于 2013-01-11T18:05:54.353 回答
2

这就是我要做的。可能有更优雅的解决方案,但对于那些能让你到达你需要的地方的东西,这会成功。

你需要什么:

  • 紧接在引入 duff blob 之前的提交的 SHA1 <LastGoodCommit>,.
  • 包含 duff blob 的提交的 SHA1 <BadCommit>,.

你需要做什么:

  1. 获取包含 duff 提交的所有分支和标签的列表,并保存这些:

    git branch --contains <BadCommit> >branches.txt
    git tag --contains <BadCommit> >tags.txt
    
  2. 查看好的提交:

    git checkout <LastGoodCommit>
    
  3. 创建一个新的提交,它将替换包含坏 blob 的提交。

    您可能可以使用git cherry-pick -n <BadCommit>来获取更改,也可能不会。我无法对其进行测试,因此您需要自己尝试一下,看看会发生什么。如果它不起作用,您应该能够使用git checkout <BadCommit>:<path>.

    您需要确定您希望该site.css文件在此提交中的样子。我可以看到两个选项:

    • 保持原样<LastGoodCommit>

    • 找到下一次你在你的site.css一个分支中有一个好的 blob (理想情况:它在所有分支中都是一样的)并使用它。

    无论您做什么,请注意新的提交哈希<NewGoodCommit>

  4. 将上面列出的所有branches.txt包含错误提交的分支重新设置到这个新提交上。根据您在步骤 3 中选择的选项,您可能会遇到合并冲突;只需使用新版本的文件解决这些问题。

    如果所有分支都具有相同的以下版本site.css,您应该可以确信不会发生冲突,并使用以下单行代码进行所有变基:

    while read branchname; do git rebase --onto <NewGoodCommit> <BadCommit> "$branchname" || echo "Failed rebasing $branchname" && break; done
    
  5. 浏览您的标签(在 中tags.txt)并为新重新设置的分支上的每个标签创建替换。可悲的是,我不知道一种自动化的方法。

于 2013-01-11T17:30:01.997 回答