2013-01-11 76 views
4

我有一個在這裏可以看到是否有可能得到混帳忽略損壞的BLOB

 
> git fsck --full 
error: unable to unpack 5426a4097ea6a3597a1674b0b7fa67f395006f2a header 
error: inflateEnd: stream consistency error (no message) 
fatal: loose object 5426a4097ea6a3597a1674b0b7fa67f395006f2a (stored in .git/obj 
ects/54/26a4097ea6a3597a1674b0b7fa67f395006f2a) is corrupt 

混帳貓文件-t 542損壞的blob對象......也同樣無法解壓錯誤標題

我檢查了其他機器,並且都有損壞的版本。

我通過這個過程的工作 - http://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/howto/recover-corrupted-blob-object.txt和範圍縮小到一個特定的文件(的site.css)和日期範圍(提交前,後),但我不打算能夠重建的變化來恢復該文件,因爲它是很久以前發生的一系列相當重要的變化的一部分:很久以前,我真的不關心那段歷史。我可以做點什麼來忘記歷史中的那一點 - 有點變態(儘管我想象一下變質會失敗 - 還沒有嘗試過)!

回答

4

看看git-replace manpage。替換機制允許您使用不同的散列代替舊散列的新塊。這可能適合你。

+0

這讓我再次感謝。 – Andiih

2

這是我會做的。可能會有更優雅的解決方案,但對於那些能夠幫助您達到需要的地方的解決方案而言,這可以起到訣竅的作用。

你需要什麼:

  • 介紹了達夫的blob,<LastGoodCommit>的一個前的承諾,立即SHA1。
  • 提交的SHA1包含duff blob,<BadCommit>

你需要做的:

  1. 獲取所有包含達夫提交的分支和標籤的列表,並保存這些關:

    git branch --contains <BadCommit> >branches.txt 
    git tag --contains <BadCommit> >tags.txt 
    
  2. 時退房好承諾:

    git checkout <LastGoodCommit> 
    
  3. 創建一個新的提交,它將替換包含壞blob的提交。

    您可能可以使用git cherry-pick -n <BadCommit>來獲取更改,或者可能不會。我無法測試它,所以你需要嘗試一下自己,看看會發生什麼。如果不起作用,您應該可以使用git checkout <BadCommit>:<path>來檢出單個文件和目錄。

    你需要弄清楚你想要site.css文件看起來像這個提交。我可以看到兩個選項:

    • 就離開它,因爲它是在<LastGoodCommit>

    • 找到您要site.css良好的斑點在你的分支之一,下一次(理想的情況:它在同一所有分支)並使用它。

    無論你做什麼,都要注意新的提交散列<NewGoodCommit>

  4. 將上面列出的branches.txt中的所有分支重新包含在包含對此新提交的錯誤提交的列表中。根據您在第3步選擇的選項,您可能會合並衝突;只需使用新版本的文件解決這些問題。

    如果所有的分支有site.css相同以下的版本,你應該能夠確信不會有衝突,並使用下面的一行代碼來完成所有的底墊:

    while read branchname; do git rebase --onto <NewGoodCommit> <BadCommit> "$branchname" || echo "Failed rebasing $branchname" && break; done 
    
  5. 仔細閱讀你的標籤(在tags.txt),併爲新改建的分行上的每個標籤創建替代品。可悲的是我不知道一種方法來實現這一點。