我有一个腐败的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>
答案 0 :(得分:4)
看看git-replace
manpage。替换机制允许您使用不同的哈希值来替换旧的blob。这可能适合你。
答案 1 :(得分:2)
这就是我要做的。可能有更优雅的解决方案,但是对于那些能够让你到达目的地的东西,这就行了。
你需要什么:
<LastGoodCommit>
之前的提交的SHA1。<BadCommit>
。您需要做什么:
获取包含duff提交的所有分支和标记的列表,并将其保存:
git branch --contains <BadCommit> >branches.txt
git tag --contains <BadCommit> >tags.txt
查看好的提交:
git checkout <LastGoodCommit>
创建一个新的提交,它将替换包含坏blob的提交。
您可以使用git cherry-pick -n <BadCommit>
来获取更改,也可以不使用。我无法测试它,所以你需要尝试自己,看看会发生什么。如果它不起作用,您应该能够使用git checkout <BadCommit>:<path>
签出单个文件和目录。
您需要在此提交中找出您希望site.css
文件的内容。我可以看到两个选项:
请保持原样<LastGoodCommit>
下次在你的某个分支中找到site.css
的良好blob时(理想情况:所有分支都相同)并使用它。
无论您做什么,请注意新的提交哈希<NewGoodCommit>
。
将包含错误提交的上述branches.txt
中列出的所有分支重新基于此新提交。根据您在步骤3中选择的选项,您可能会发生合并冲突;只需使用新版本的文件解决这些问题。
如果所有分支机构都具有相同的site.css
版本,您应该能够确信不存在任何冲突,并使用以下单行代码来完成所有的变更:
while read branchname; do git rebase --onto <NewGoodCommit> <BadCommit> "$branchname" || echo "Failed rebasing $branchname" && break; done
浏览您的代码(在tags.txt
中)并为新重新分支的分支上的每个代码创建替换。可悲的是,我不知道如何实现自动化。