从存储库中删除git corrupt blob

时间:2013-01-01 23:11:12

标签: git corrupt

我遇到了存储库中存在损坏对象的情况。

$ git push
...
fatal: loose object 95b6a826cadae849f4932a71d6735ab6ceb47cab (stored in .git/objects/95/b6a826cadae849f4932a71d6735ab6ceb47cab) is corrupt
...

而且我知道这个对象是一个旧提交链接的blob:

$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from  tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
            to    blob 95b6a826cadae849f4932a71d6735ab6ceb47cab 

我已经完成了classic steps to recover the blob from the FAQ但似乎没有任何其他副本我可以找到(我独自工作并且没有推到遥控器一段时间所以它不在那里)所以我无法恢复它。

这个blob实际上是从那时起经过多次修改的文件的第一个版本。我很好地丢失了有关该版本文件的信息。所以我想将它从指向它的提交中删除。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

好吧,我最终弄明白了。

简短版本:我修改了指向腐败blob的提交,将其从历史记录中删除。

长版本:我认为既然我知道文件是什么,只是想让它从提交中消失,那么我就可以修改旧的提交。我真的没想到它会起作用,但最终确实如此。

我必须指出,我在尝试以前的事情时删除了.git / objects中的blob,并且它可能很重要。

首先,我必须知道它是什么承诺。为此,我使用了命令

git log --raw --all --full-history -- subdir/my-file

我发现提交被命名为966a46 ....

然后我做了修改它的步骤。由于这是一个旧提交,我使用

git rebase -- interactive 966a46^

我的编辑器为每个提交输入了一行,并且在我想要修改的提交之前将“pick”更改为“edit”。

命令git status向我显示我要删除的文件已被修改:

# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   subdir/my-file

我想从提交中删除它,所以我做了rm subdir/my-filegit status然后告诉我:

#       deleted:    subdir/my-file

这看起来很有希望。所以我只是提交修改后的提交并继续使用rebase:

git commit --all --amend
git rebase --continue

但是在重新设置了一些提交后,它失败了,出现了这个错误:

error: could not apply 45c2315... did some fancy things
fatal: unable to read 95b6a826cadae849f4932a71d6735ab6ceb47cab

45c2315是我的文件在创建后被修改的第一个提交。由于它没有找到该文件的先前版本,因此它失败了。

git status向我展示了以下内容:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      subdir/my-file

我实际上不确定它的意思,但是这个提交应该是修复后文件出现的第一个。所以我不希望它被删除,但相反,添加到提交!所以我做了

git add subdir/my-file

肯定git status将其显示为“新文件”。

然后我做了git rebase --continue并且一切都很顺利,并且变基很成功。

然后

git push顺利进行而不是破坏了破碎的斑点。

但仍有问题,因为git fsck仍然失败:

$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from    tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
              to    blob 95b6a826cadae849f4932a71d6735ab6ceb47cab

当我要求他修剪一切时,git gc也失败了。所以我发现最好的行动方案是,自从我之前成功推出以来,将所有内容克隆回新的存储库并从那里开始工作。