2012-05-20 8 views
13

Wenn git fetch zum Beispiel durch Ctrl-C oder durch Verbindungsprobleme unterbrochen wird, funktionieren danach git fetch und auch git pull nicht mehr.Wie kann ich das Git-Repository reparieren, das durch einen unterbrochenen Git-Abruf unterbrochen wurde?

[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. 

Ich glaube, das ist nicht im Zusammenhang mit dem Repository. Die Verwendung von git clone zum Erstellen einer Kopie dieses beschädigten lokalen Repositorys in einem neuen lokalen Repository behebt dies nicht. Die einzige Lösung, die ich bisher kenne, ist git clone das gesamte Remote-Repository (origin/master) in ein neues lokales Repository. Aber gibt es eine bessere (schnellere) Lösung?

Es gibt Debian bug report, die letzte Nachricht vom Februar 2011 hat. Ist das der gleiche Fehler, den ich habe oder gibt es bereits eine Lösung oder einen Workaround? Meine Git Version ist 1.7.10.

Antwort

6

finden Sie eine *.pack.temp in .git/objects/pack in Ihrem lokalen Repository. Suchen Sie dann eine .idx Datei mit dem gleichen Basisnamen, und verschieben Sie beide weg (oder entfernen Sie sie, aber es ist besser als Nachsicht). Wiederholen Sie git fetch und es sollte funktionieren (gut, es tat es für mich).

Zum Beispiel:

% 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

Danke, das funktioniert. Es sollte angemerkt werden, dass es mehrere '* .pack.temp' und entsprechende' * .idx' Dateien geben kann (ich hatte 3 von beiden). Ich habe sie alle in ein separates Verzeichnis verschoben, und danach haben 'git fetch' und' git merge origin/master' richtig funktioniert. – nrz

-1

Sind Sie in der Lage zu laufen:

git reset --hard <some prior commit> 

In der Theorie, wenn man nur git fetch laufen haben, sollten Sie in der Lage sein: Dieses

git reset --hard HEAD 

sollten die Änderungen, die durch die Unterbrechung verwerfen Fetch-Operation, die Ihr Repository in einen vorherigen Zustand zurückversetzt. An diesem Punkt sollten Sie in der Lage sein, Ihre fetch Operation erneut auszuführen.

+0

Ich bin in der Lage 'git reset --hard HEAD ~ 20 '(zum Beispiel) laufen und es läuft ohne Probleme, aber das Problem mit' git fetch' und 'git Pull' bleibt gleich. Ich denke, das "benötigte Objekt" sollte irgendwie repariert werden, aber ich weiß nicht wie. – nrz

-1

Haben Sie versucht, den Repo zu reinigen?

git gc 

Seien Sie gewarnt, wie der obige Befehl auch die Reflog-Zeug reinigt.

+0

'git gc' gibt folgendes aus:' user @ computer: ~/code/openttd-broken-git $ git gc Zählobjekte: 150683, fertig. Delta-Komprimierung mit bis zu 8 Threads. Komprimieren von Objekten: 100% (24232/24232), fertig. Objekte schreiben: 100% (150683/150683), fertig. Summe 150.683 (delta 126184), wieder verwendet 150626 (delta 126127) schlecht SHA1-Datei: .git/Objekte/22/d90742fc79a9011fb86ee03d8aeea66bc12657.temp' Nach dem 'git fetch' Ausgänge:' Fehler: Kann nicht ce35909568caea9116c69b0a9d0cf6810d6507a5 unter http finden://git.openttd.org/openttd/trunk.git Kann benötigten Blob nicht erhalten ce35909568caea9116c69b0a9d0cf6810d6507a5' ... – nrz

8

Versuchen Sie diese Befehle:

git fsck 
git gc 
+1

Sagen Sie, was die Befehle auch tun und es wird für andere hilfreicher sein. Gute Antwort. –

+0

Ich habe gerade das gleiche Problem und diese Befehle lösen es nicht (wie in einem der folgenden Kommentare erwähnt). –

+1

Das löst das Problem nicht. '$ git fsck' Ausgaben:' Objektverzeichnis überprüfen: 100% (256/256), done.' 'Objekte prüfen: 100% (161159/161159), done.' Dann gibt' $ git gc' aus: 'Zählen von Objekten: 157646, erledigt. '' Delta-Komprimierung mit bis zu 8 Threads. '' Komprimieren von Objekten: 100% (24579/24579), fertig. '' Schreiben von Objekten: 100% (157646/157646), erledigt. '' Gesamt 157646 (delta 133211), wiederverwendet 157173 (Delta 132738) '. Und dann gibt '$ git fetch' das gleiche wie oben aus, so dass das Problem nicht gelöst wird. – nrz

1
man git-fsck 

sagt rsync zu verwenden:

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 

für mich gearbeitet

-1

Es ist wahrscheinlich, dass das Repository ist corrup t. Das Ausführen von git fsck und git gc auf dem Server löst es möglicherweise. Klonen in ein separates Verzeichnis und Ziehen aus diesem Verzeichnis gibt Ihnen auch die Commits. Danach funktioniert ein git fetch, da es nur die Refs aktualisiert und keine Objekte holen muss.