注意:我沒有任何此存儲庫的損壞前克隆。我相信我的情況與這裏描述的其他人不同,因爲我錯過了一棵樹,而不是一個blob。Git恢復:「目標文件爲空」。如何重新創建樹木?
發生了什麼事:
當我試圖克隆了LAN(通過SSH)存儲庫,Git會返回一個錯誤,指出該庫已損壞:
remote: error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
remote: fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
我在什麼地方發現git fsck
可用於診斷腐敗,但它並沒有告訴我任何新的東西:
git fsck --full
error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt
我試圖克隆reposito本地(使用--no-hardlinks
)查看會發生什麼,但我得到的結果完全相同。
然後我在this question迷迷糊糊的,誰回答的傢伙剛剛刪除的空文件(步驟3),所以我這樣做(即我已經刪除了子目錄文件223ce259e9e33998d434acc778bc64b393d5d4
)。
git fsck
一遍,我看到:
Checking object directories: 100% (256/256), done.
broken link from tree 838e437f371c652fa4393d25473ce21cbf697d7a
to tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 54146bc0dc4eb3eede82a0405b749e05c11c5522
missing tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 864864feec207786b84158e526b2faec7799fd4e
dangling blob d3cfd7cc7718d5b76df70cf9865db01c25181bfb
所以,現在有樹木838e437f37
問題。這不是上面提到的那個傢伙發生的事情,所以我去谷歌搜索,發現some information from Linus。
所以,我做了git ls-tree 838e437f371c652fa4393d25473ce21cbf697d7a
和輸出有這樣一行:
040000 tree 2e223ce259e9e33998d434acc778bc64b393d5d4 moje
現在,「moje」是目錄(不像萊納斯解釋說,這是一個文件中的示例)。我想這就是爲什麼Linus建議下一步,git hash-object moje
返回fatal: Unable to hash moje
。
但無論如何,這只是一個小的機會,這是我所需要的,所以我進一步尋找。我跑了git log --raw --all --full-history -- moje/
,根據Linus的指南,應該有一個提交列出2e223作爲一些內容的SHA-2散列,但沒有。並且列表以
fatal: unable to read source tree (2e223ce259e9e33998d434acc778bc64b393d5d4)
我試着查看錯誤之前列出的最後一個提交,但是我沒有找到這個哈希。我見過this,但它沒有幫助我,可能是因爲是有問題的版本和工作樹的當前狀態之間的一些變化。
有一件事情可能很重要:在moje/
裏面有一個目錄cli/
,它是一個Git倉庫本身(一個子模塊)。我已經在那裏尋找有問題的SHA-2哈希,但還沒有找到它。
我該怎麼辦?
很好的意見,但你也可以將它張貼作爲自己的回答你的問題。你甚至可以接受你自己的答案,但不要這樣做;)Chronial的答案贏得了公平和正確的「刻度標記」。 – VonC 2013-02-13 11:45:49
當然,Chronial的答案將保持公認的答案:)我已經將解決方案移至單獨的答案中,正如所建議的那樣。 – 2013-02-14 09:21:27