是否有可能让git忽略腐败的blob

时间:2013-01-11 15:12:22

标签: git

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

> git fsck --full
error: unable to unpack 5426a4097ea6a3597a1674b0b7fa67f395006f2a header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 5426a4097ea6a3597a1674b0b7fa67f395006f2a (stored in .git/obj
ects/54/26a4097ea6a3597a1674b0b7fa67f395006f2a) is corrupt

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)和日期范围(提前和提交),但我无法重建更改以恢复文件,因为它是很久以前发生的一系列相当重大变化的一部分:很久以前,我真的不关心那段历史。

由于我现在已经拥有了之前和之后的哈希值,我能做些什么来忘记历史的那一点 - 有点像一个底板(虽然我想一个底板会失败 - 还没试过它!)< / p>

2 个答案:

答案 0 :(得分:4)

看看git-replace manpage。替换机制允许您使用不同的哈希值来替换旧的blob。这可能适合你。

答案 1 :(得分:2)

这就是我要做的。可能有更优雅的解决方案,但是对于那些能够让你到达目的地的东西,这就行了。

你需要什么:

  • 在引入duff blob <LastGoodCommit>之前的提交的SHA1。
  • 包含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中)并为新重新分支的分支上的每个代码创建替换。可悲的是,我不知道如何实现自动化。