2012-02-20 47 views
2

我正在調試由硬盤驅動器故障導致的git存儲庫損壞情況。我有查找對象屬於哪個提交?

>git fsck --full 
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in 
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt 

>git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in 
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt 

現在,我想知道關於此對象的一些事情 - 它是什麼,它屬於哪裏? (哪個文件夾,其呈交?)

當我試圖調查對象的存儲,我得到:

>git show e9d8d2deb964c3da0f86f60bbd5a23e8387349 
fatal: ambiguous argument 'e9d8d2deb964c3da0f86f60bbd5a23e8387349': unknown revision or 
path not in the working tree. Use '--' to separate paths from revisions 

我應該如何進行?

我有一個從今天早些時候的存儲庫的副本,但我不想只是垃圾我的本地更改 - 我寧願看看我是否可以修復回購,或者只是垃圾一個提交。

P.S. - 我發現了一些關於「鬆散對象」問題的線索,但沒有提供關於如何調查/解決的具體指示,無論是在哪裏找到另一個回購庫中的腐敗對象的備份,以及在沒有備份這個對象。

P.S. 2 - 奇怪的是,gitk --all運作良好,並不在乎這種腐敗狀態。

+0

我想說的第一件事就是使用'git cat-file -p'來試圖找出它是什麼類型的對象。 – 2012-02-20 21:55:12

+0

@格雷格 - 輸出:'錯誤:無法解開25e9d8d2deb964c3da0f86f60bbd5a23e8387349頭 錯誤:inflateEnd:失敗 致命的:不是有效的對象名25e9d8d2deb964c3da0f86f60bbd5a23e8387349' – ripper234 2012-02-20 22:00:14

+0

好吧,也許嘗試一些其他的'貓file'選項,看看你能找出。 – 2012-02-20 22:02:44

回答

2

消息「鬆散對象25e9d8d2deb964c3da0f86f60bbd5a23e8387349」告訴你已經有了所述對象的確切哈希值;它是25e9d8d2deb964c3da0f86f60bbd5a23e8387349。 Git通過拆分單獨目錄的前兩個字符來組織子目錄中的對象。因此該對象存儲在/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349中,但不會更改其標識符是完整散列。因此,您只需要使用git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349即可。但是,由於對象已損壞,因此無法將其恢復。

然而,好消息是「鬆散對象」意味着沒有任何東西指向它,所以如果你的存儲庫是好的,你將不需要該對象。

Oddly enough, gitk --all works well and doesn't care about this corrupt state.

gitk - 以及幾乎所有其他用戶從Git命令 - 只能看從頭部或其他命名引用(分支,標籤)可達的對象。所以如果有一個鬆散的對象,沒有任何東西指向它,因爲這樣尤其是HEAD和另一個命名引用都沒有指向它,並且不會出現錯誤。

+0

'所以如果您的存儲庫是好的,你不會需要該對象。' - 有沒有辦法簡單地將索引恢復到最後一次已知的好提交?像'reset --hard'這樣的東西會在腐敗的回購中起作用嗎? – ripper234 2012-02-20 22:50:11

+0

我不認爲你真的是指索引。但是當然你可以使用'reset --hard'將HEAD移動到不同的提交。正如我所說的,您的存儲庫似乎不是腐敗的;只是一個*鬆散*對象,所以一切都應該罰款無論如何。 – poke 2012-02-21 12:19:25