2012-05-20 384 views
13

如果git fetch被例如Ctrl-C中斷或由連接問題導致,那麼git fetchgit pull無法工作。如何修復由中斷的git fetch破壞的git存儲庫?

[email protected]:~/code/openttd-git$ git fetch 
^C 
[email protected]:~/code/openttd-git$ git fetch 
error: Unable to find 22d90742fc79a9011fb86ee03d8aeea66bc12657 under http://git.openttd.org/openttd/trunk.git 
Cannot obtain needed object 22d90742fc79a9011fb86ee03d8aeea66bc12657 
error: Fetch failed. 

我相信這與倉庫無關。使用git clone創建這個破損的本地存儲庫到一個新的本地存儲庫的副本不能解決這個問題。到目前爲止,我所知道的唯一解決方案是將整個遠程存儲庫(origin/mastergit clone放入新的本地存儲庫。但有沒有更好的(更快的)解決方案?

Debian bug report,它有來自2011年2月的最後一條消息。這是同樣的錯誤,我有或已經有一個修復或解決方案或解決方法嗎?我的git版本是1.7.10。

回答

6

在您的本地存儲庫中找到*.pack.temp.git/objects/pack。然後找到一個具有相同基本名稱的.idx文件,並將它們都移走(或刪除它們,但最好是安全而不是抱歉)。重新運行git fetch,它應該工作(嗯,它對我來說)。

例如:

% git fetch 
error: Unable to find a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 under https://www.example.com/~someuser/something.git 
Cannot obtain needed object a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 
error: fetch failed. 

% ls -l .git/objects/pack 
total 65872 
-rw-r--r-- 1 someuser someuser 64072 Feb 12 2014 pack-2e31e66e67d8596f1193bbbc06c87293900c6e45.idx 
-rw-r--r-- 1 someuser someuser 16920 Jul 21 2013 pack-3d76e0bf6c67d71913efc0711d56f04c7f79b95d.idx 
-rw-r--r-- 1 someuser someuser 62224 Feb 11 2014 pack-74107fa80989df6619479874d94b5f8ed010fd2f.idx 
-rw-r--r-- 1 someuser someuser 96552 Oct 30 22:55 pack-bb75633331ea0e74d4d3cb29f7660e1ba00fb899.idx 
-rw-r--r-- 1 someuser someuser 73228 Mar 6 2014 pack-de0c1bcf3550cd7a2fd0c5a981bc17d15f1144c0.idx 
-r--r--r-- 1 someuser someuser 129144 Feb 2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.idx 
-r--r--r-- 1 someuser someuser 46413554 Feb 2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.pack 
-r--r--r-- 1 someuser someuser 129312 Feb 2 19:10 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx 
-rw-r--r-- 1 someuser someuser 20450545 Feb 2 19:09 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack 
-rw-r--r-- 1 someuser someuser 129312 Feb 2 18:36 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx 
-rw-r--r-- 1 someuser someuser 9863168 Feb 2 18:37 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp 

% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx /tmp/ 
% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp /tmp/ 
% git fetch 
From https://www.example.com/~someuser/something 
    3288ab9..a4fb0b5 master  -> origin/master 
+1

謝謝,這個工程。應該指出,可以有幾個'* .pack.temp'和相應的'* .idx'文件(我有兩個)。我把它們全部移到了一個單獨的目錄,然後'git fetch'和'git merge origin/master'正常工作。 – nrz

-1

您能夠運行:

git reset --hard <some prior commit> 

從理論上講,如果你剛剛運行git fetch,你應該能夠:

git reset --hard HEAD 

這應該丟棄造成中斷的變化獲取操作,將您的存儲庫返回到之前的狀態。此時您應該能夠重新運行您的fetch操作。

+0

我能夠運行'git的復位 - 硬HEAD〜20'(例如),它運行沒有問題,但用'git的fetch'和'git的問題拉'保持不變。我認爲「需要的對象」應該以某種方式得到解決,但我不知道如何。 – nrz

-1

您是否試過清洗回購?

git gc 

被警告,因爲上面的命令還清理了reflog的東西。

+0

'git gc'輸出如下內容:'user @ computer:〜/ code/openttd-broken-git $ git gc 計數對象:150683,完成。 增量壓縮使用多達8個線程。 壓縮對象:100%(24232/24232),完成。 書寫對象:100%(150683/150683),完成。 總計150683(增量126184),再利用150626(增量126127) 壞SHA1文件:git的/對象/ 22/d90742fc79a9011fb86ee03d8aeea66bc12657.temp' 其中'GIT中fetch'輸出後:'錯誤:無法找到ce35909568caea9116c69b0a9d0cf6810d6507a5下HTTP:/ /git.openttd.org/openttd/trunk.git 無法獲得所需的blob ce35909568caea9116c69b0a9d0cf6810d6507a5' ... – nrz

8

嘗試鍵入以下命令:

git fsck 
git gc 
+1

告訴命令做什麼,它會對其他人更有幫助。雖然很好的答案。 –

+0

我剛剛遇到同樣的問題,這些命令不能解決它(如下面的註釋之一所述)。 –

+1

這並不能解決問題。 '$ git fsck' outputs:'檢查對象目錄:100%(256/256),done.''檢查對象:100%(161159/161159),done.'然後'$ git gc' outputs:'計數對象: ''使用多達8個線程的增量壓縮.''壓縮對象:100%(24579/24579),完成.''寫入對象:100%(157646/157646),done.''總計157646 133211),重新使用157173(delta 132738)'。然後'$ git fetch'輸出和上面一樣,所以這並不能解決問題。 – nrz

1
man git-fsck 

說使用rsync:

Any corrupt objects you will have to find in backups or other archives (i.e., you can just remove them and do an rsync with some other site in the hopes that somebody else has the object you have corrupted).

rsync -av [email protected]:repo/.git ./.git 

工作對我來說

-1

很可能是倉庫治理腐敗噸。在服務器上運行git fsckgit gc可能會解決此問題。克隆到一個單獨的目錄並從該目錄中拉出來也會給你提交。之後git fetch將工作,因爲它只更新參考並且不必獲取任何對象。