2013-01-01 201 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失敗過,當我問他修剪的一切。所以我想出了最好的行動方式,因爲我之前已經成功推動過,將所有事情都克隆回新的存儲庫中,並從那裏開始工作。