从存储库中删除git corrupt blob
我有一个存储库中存在损坏对象的情况。
$ git push
...
fatal: loose object 95b6a826cadae849f4932a71d6735ab6ceb47cab (stored in .git/objects/95/b6a826cadae849f4932a71d6735ab6ceb47cab) is corrupt
...
而且我知道这个对象是一个旧的犯下连接的斑点:
$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab
我已经完成了从常见问题解答中恢复blob的经典步骤,但似乎没有其他任何地方可以找到它的副本(我正在单独工作,并且没有推到遥控器一段时间,所以它不在那里)我无法恢复它。
这个blob实际上是一个文件的第一个版本,自那以后已经被修改了很多。 我很好地丢失了关于该版本文件的信息。 所以我想只是将它从指向它的提交中移除。 我怎样才能做到这一点?
好的,我终于明白自己了。
简短版本:我修改了指向腐败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-file
。 然后git 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
然后顺利地进行了,而不是失败的破损的blob。
但仍然存在问题,因为git fsck
仍然失败:
$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab
当我让他修剪一切时, git gc
失败了。 所以我想出了最好的行动方式,因为我之前已经成功推动过,将所有事情都克隆回新的存储库中,并从那里开始工作。