2012-05-20 387 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将工作,因为它只更新参考并且不必获取任何对象。