gpt4 book ai didi

git - 从存储库中删除 git corrupt blob

转载 作者:太空狗 更新时间:2023-10-29 13:02:29 24 4
gpt4 key购买 nike

我的情况是存储库中有损坏的对象。

$ 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但似乎在我能找到的任何地方都找不到它的其他副本(我独自工作,有一段时间没有推送到 Remote ,所以它不在那里)所以我无法恢复它。

这个 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-filegit status 然后显示给我:

#       deleted:    subdir/my-file

这看起来很有希望。所以我简单地提交了修改后的提交并继续 rebase:

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

但是在 rebase 了一些提交之后,它失败了,并出现了这个错误:

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

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

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 也失败了,当时我要求他修剪所有内容。所以我想出最好的行动方案是,因为我之前已经成功推送,将所有内容克隆回新存储库并从那里开始工作。

关于git - 从存储库中删除 git corrupt blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com