2013-01-01 156 views
7

我遇到存储库中存在损坏对象的情况。从存储库中删除git corrupt blob

$ 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实际上是一个文件的第一个版本,从那以后它被修改了很多。我很好地丢失了关于该版本文件的信息。所以我想只是将它从指向它的提交中移除。我怎样才能做到这一点?

+0

尝试看看这里的一些解决方案:http://stackoverflow.com/q/4254389/1031900 –

+0

这个问题是关于一个损坏的树,这是有点不同。可悲的是,这些答案都不能帮助我。我会尝试一些事情,如果他们工作,会在这里发布。 –

回答

4

好的,我终于明白自己了。

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

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

我必须指出,我在尝试之前的事情中删除了.git/objects中的blob,这对于它的工作原理可能很重要。我不得不知道它是什么。对于我所使用的命令

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

我发现提交被评为966a46 ....

然后我做了修改它的步骤。由于这是一个古老的承诺,我用

git rebase -- interactive 966a46^ 

我的编辑来与一个行每次提交,我改变了“捡”到的承诺,我想修改前的“编辑”。

命令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 

这看起来很有希望。所以我只是犯了修订,提交延续了底垫:

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并且一切都很顺利,并且rebase成功了。

git push然后顺利地去了,而不是失败的破损斑点。

但仍有一个问题,因为git fsck仍然未能:

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

而且git gc失败过,当我问他修剪的一切。所以我想出了最好的行动方式,因为我之前已经成功推动过,将所有事情都克隆回新的存储库中,并从那里开始工作。