好的,我终于明白自己了。
简短版本:我修改了指向损坏的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-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
然后顺利地去了,而不是失败的破损斑点。
但仍有一个问题,因为git fsck
仍然未能:
$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab
而且git gc
失败过,当我问他修剪的一切。所以我想出了最好的行动方式,因为我之前已经成功推动过,将所有事情都克隆回新的存储库中,并从那里开始工作。
尝试看看这里的一些解决方案:http://stackoverflow.com/q/4254389/1031900 –
这个问题是关于一个损坏的树,这是有点不同。可悲的是,这些答案都不能帮助我。我会尝试一些事情,如果他们工作,会在这里发布。 –