好的,我終於明白自己了。
簡短版本:我修改了指向損壞的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 –
這個問題是關於一個損壞的樹,這是有點不同。可悲的是,這些答案都不能幫助我。我會嘗試一些事情,如果他們工作,會在這裏發佈。 –