2010-11-18 7 views
8

Mam duże problemy z repozytorium git na moim komputerze lokalnym.Skorumpowane drzewo git?

Zmodyfikowałem plik, uruchomiłem git status i plik pojawił się jako zmodyfikowany. Dodałem plik przy użyciu git add . i działało jak zwykle. Ale kiedy miałem zamiar zatwierdzić zmiany, mam następujący błąd:

error: garbage at end of loose object 'e91ce852822d32e380ed7ddd04c93066e3c600ea' 
fatal: object e91ce852822d32e380ed7ddd04c93066e3c600ea is corrupted 

Uruchamiając git cat-file -t e91ce852822d32e380ed7ddd04c93066e3c600ea, widzę, że przedmiot jest drzewem.

Widziałem kilka rozwiązań, w jaki sposób naprawić uszkodzony obiekt blob lub zatwierdzenie, ale jest to drzewo i nie mogę znaleźć odpowiedzi na pytanie, co mogło pójść źle, lub jak to naprawić.

Każda pomoc mile widziane :)

+2

Czy uruchomiłeś 'git fsck'? –

+0

Tak, ten sam błąd. Jednak jest to kolejny obiekt, to także drzewo. –

+0

@MarkRushakoff: Właśnie dostałem ten sam błąd co Olof, a 'git fsck' po prostu wyświetla ten sam komunikat o błędzie. –

Odpowiedz

2

Co mogło pójść nie tak trudno jest powiedzieć, i zależy od wersji Git i środowiska.
Na przykład w dawnych czasach było zlib issue with git1.5.1 wyzwalanie tego rodzaju wiadomości ze względu na ustawienia legacyheaders = false.

chodzi o przywracanie drzewa z loose objects, to SO odpowiedzieć „How to recover Git objects damaged by hard disk failure?” ilustruje sposób to zrobić, po tym, że git fsck --full (jak Mark Rushakoff wspomina w komentarzu) została wykonana.

git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee 

and check the type of the object.

If the type is tree: you could use 'git ls-tree' to recover the tree from previous backups; then ' git mktree ' to write it again in your current repository.

Ale załóżmy, że znalezienie tych obiektów zarówno w starszych paczek lub repozytorium kopii zapasowych.

+0

Natknąłem się również na to pytanie, ale .git/objects/pack/jest pusty. Jak przeprowadzić wyszukiwanie za pomocą starszych paczek? –

+0

@Olof: starsze paczki? Wydaje mi się, że jest to miejsce, w którym pojawia się ostatnie zdanie "Ale przypuszczam, że znajdowanie tych obiektów w starszych paczkach lub w kopiach zapasowych repozytorium". Czy masz jakieś kopie zapasowe? – VonC

+0

Mam kopię zapasową, ale niestety jest to około miesiąca. Jak znaleźć je w starszych paczkach? Nie mogę też wypróbować starszego zatwierdzenia, jedyną rzeczą, która wydaje się działać, jest dziennik git. –

-2

Dzień dobry, z mojej strony, Właśnie usunąłem katalog git i ponownie zainicjowałem git.

+0

Czy masz na myśli usunąć katalog '.git'? wtedy ... nie "git init" chyba? –

3

Jeśli git repo jest zsynchronizowany z Ressource zewnętrznego (github) i jeśli rozwiązanie nie działa, można ponownie inicjalizacji Twój repo

co zrobiłem:

# copy the corrupted .git dir 
mv -f .git .gitback 
git init 
# keep your config file 
cp .gitback/config .git/config 
# load objects 
git pull 

Zadziałało. Oczywiście, to nie jest świetne rozwiązanie, ale może pomóc

+0

Czasami to wszystko, co możesz zrobić. Nie jest to jednak świetne rozwiązanie, a do zaakceptowania tylko w przypadku projektów solowych :) –