2014-05-18 11 views
44

Wczoraj wieczorem doświadczyłem awarii zasilania podczas pisania komunikatu zatwierdzenia. Po ponownym uruchomieniu maszyny nie mogłem ukończyć zatwierdzania. Pobiegłem git reset dodał powrotem zmienionych plików i spróbował ponownie i dostał to:Uszkodzone repozytorium Git (niepoprawne sprawdzanie nagłówka, luźny obiekt jest uszkodzony)

% git commit 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header 
fatal: a94406345ac44982b00cf57b4b9660a35436637f is not a valid object 

git fsck ujawnia, co następuje:

% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack 4346883490a0990e68db0187241abc1642765a73 header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object 4346883490a0990e68db0187241abc1642765a73 (stored in .git/objects/43/46883490a0990e68db0187241abc1642765a73) is corrupt 

zauważam wiadomości skarżą się różnymi przedmiotami.

Szukałem SO i internetu i próbowałem kilku różnych rzeczy, ale bezskutecznie.

  • Nie mam najnowszej kopii zapasowej.
  • Klonowanie repozytorium w innym katalogu nie pomaga; nowe repozytorium wykazuje dokładnie te same problemy.
  • git stash podaje tę samą wiadomość, co git commit. Wszystkie pozostałe polecenia git wydają się działać normalnie.

Jak mogę stwierdzić, co jest nie tak i naprawić?

Edit:git log wyprowadzane jako sugerowane (wystarczy kilka pierwszych linii):

% git log --oneline --decorate --all |head -n 8 
253b086 (HEAD, new_tokenize) Normalized tokenizer interface slightly 
0f2425a (master) Added procs to eval layer 
a4d4c22 Added procedures as a type 
d1e15ad (tag: v0.10) Added `if' form with tail call semantics 
f94a992 (tag: v0.9) Completed environments 
031116e Fixed bug where # on a line by itself caused segfault 
3d8b09f Added environments, define and set! 
01cc624 Put symbol table implementation into types.c 

Jest to mały osobisty projekt; Zwykle po prostu pracuję (master), ale robiłem eksperyment w tym czasie (new_tokenize). 253b086 było ostatnim udanym zatwierdzeniem przed awarią zasilania.

+0

Być może spróbuj 'git log' lub' git log --oneline --decorate --all', aby zobaczyć, jak wygląda historia – jkyako

+0

Gotowe. Nie wiesz, czego dokładnie szukasz, daj mi znać, jeśli chcesz uzyskać pełną wydajność lub co. Nie robiłem nic nadzwyczajnego. – trentcl

+0

Głównie po prostu próbuję dowiedzieć się, co ostatecznie jest stracone/niedostępne, biorąc pod uwagę uszkodzone obiekty zgłoszone. Zakładając, że masz jakieś niezatwierdzone lokalne zmiany zapisane gdzieś indziej, czy jesteś w stanie "git checkout", że każdy z wymienionych przez ciebie identyfikatorów znajduje się w logu? Zastanawiam się, czy rozwiązaniem może być skryptowanie każdego identyfikatora, sprawdzanie identyfikatora, kopiowanie działającego drzewa w innym miejscu (ewentualnie nowe repozytorium git), aby spróbować odbudować repozytorium nieuszkodzone. – jkyako

Odpowiedz

50

Wygląda na to, że git utworzył pliki w pliku .git/objects dla nowego zatwierdzenia, ale nie zapisał do nich poprawnie. Rozwiązałem go, kasując je po jednym na raz i ponownie wybierając git fsck --full, aby znaleźć następny. Zacząłem od jednego pierwotnie zgłoszonych przez git fsck:

% rm -f .git/objects/43/46883490a0990e68db0187241abc1642765a73 
% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack 86e7247af5865e857a3b61eed99986e2d9538df1 header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object 86e7247af5865e857a3b61eed99986e2d9538df1 (stored in .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1) is corrupt 
% rm -f .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1 
% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object a94406345ac44982b00cf57b4b9660a35436637f (stored in .git/objects/a9/4406345ac44982b00cf57b4b9660a35436637f) is corrupt 

i tak dalej. Usunąłem pięć obiektów przed git fsck wymyślonych, odpowiadając (jak przypuszczam) pięciu plikom z zatwierdzenia, które próbowałem wykonać. Przypuszczam, że historia plików nie była w ogóle uszkodzona.

Nawiasem mówiąc, pomyślałem o innej metodzie, która również wydaje się działać. git clone kopiuje złe obiekty, ale git push nie. Po utworzeniu kopii zapasowej utworzyłem nowe puste repozytorium (-bare, ponieważ w przeciwnym razie nie można przekazać do opanowania), następnie rozproszyłem moje zmiany i przesunąłem obie gałęzie do nowego repozytorium. Potem chodziło tylko o sprawdzenie go i przywrócenie najnowszych zmian z moich kopii zapasowych.

Wciąż zainteresowany, jeśli ktoś chce rzucić światło na mechanizm awarii tutaj.

+0

Wielkie dzięki. Uratowałeś mój dzień ... –

8

Prosta odpowiedź na to pytanie dla każdego, kto mierzy się z tym problemem: polecenie git clone to poprawka, jeśli masz zdalne repo, sklonuj je do folderu lokalnego (po usunięciu uszkodzonego lokalnego repozytorium), na wypadek gdybyś nie miał zdalnego repo następnie spróbuj wcisnąć uszkodzony repo do gitHub a następnie sklonować go stamtąd, myślę, że uszkodzonych obiektów przyzwyczajenie być popychany będzie rozwiązać problem

+2

Może to "rozwiązać" problem, ale utracisz uszkodzone pliki. –

2

jak opisano w this answer wpadłem:

git reflog expire --expire-unreachable=now --all 
git gc --prune=now 

która usunąłem wszystkie moje wiszące obiekty typu blob i zwisające zatwierdzenia, a także uszkodzone obiekty db.

To było dużo szybsze niż śledzenie ich pojedynczo!

+0

git gc --prune = teraz daje mi ten sam błąd: niepoprawny nagłówek – IcedDante

+0

Wow, to działało dla mnie. – RoLYroLLs

Powiązane problemy