2013-01-11 33 views
4

我有一个在这里可以看到是否有可能得到混帐忽略损坏的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 

混帐猫文件-t 542损坏的blob对象......也同样无法解压错误标题

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

我通过这个过程的工作 - http://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/howto/recover-corrupted-blob-object.txt和范围缩小到一个特定的文件(的site.css)和日期范围(提交前,后),但我不打算能够重建的变化来恢复该文件,因为它是很久以前发生的一系列相当重要的变化的一部分:很久以前,我真的不关心那段历史。我可以做点什么来忘记历史中的那一点 - 有点变态(尽管我想象一下变质会失败 - 还没有尝试过)!

回答

4

看看git-replace manpage。替换机制允许您使用不同的散列代替旧散列的新块。这可能适合你。

+0

这让我再次感谢。 – Andiih

2

这是我会做的。可能会有更优雅的解决方案,但对于那些能够帮助您达到需要的地方的解决方案而言,这可以起到诀窍的作用。

你需要什么:

  • 介绍了达夫的blob,<LastGoodCommit>的一个前的承诺,立即SHA1。
  • 提交的SHA1包含duff blob,<BadCommit>

你需要做的:

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

    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良好的斑点在你的分支之一,下一次(理想的情况:它在同一所有分支)并使用它。

    无论你做什么,都要注意新的提交散列<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),并为新改建的分行上的每个标签创建替代品。可悲的是我不知道一种方法来实现这一点。