2010-11-06 15 views
46

zrobiłem git pull, kiedy byłem blisko mojego kontyngentu, w wyniku czego (tak myślę), ma uszkodzony plik:Jak radzić sobie z uszkodzonymi plikami obiektów git?

$ git pull 
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git fsck --full 
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3 
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3 
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file 

Jak mogę rozwiązać ten korupcją?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp było zero bajtów; usunięcie go nie przyczyniło się do rozwiązania mojego problemu (te same błędy).

+0

Zawartość musi suma sha1 do nazwy pliku. Nie ma sposobu na przywrócenie zawartości na podstawie wartości skrótu, więc jeśli git nie ma wbudowanej redundancji dla tej dokładnej sytuacji (nie mogę tego powiedzieć), muszę ponownie pobrać lub sklonować zdalne ponownie. – meagar

+0

Powiedziałeś, że go skasowałeś - czy próbowałeś później ciągnąć za sobą? Obiekt tymczasowy o zerowym rozmiarze przebija przerwaną transmisję ... – Cascabel

+0

Wyjście 'find. -name d4a0e7599494bfee2b5351113895b43c351496b3' jest niczym. Usunięcie pliku sha1, a następnie przeciągnięcie powoduje, że generowany jest pusty plik sha1. – Mike

Odpowiedz

31

Ogólnie rzecz biorąc, naprawianie uszkodzonych obiektów może być dość trudne. Jednak w tym przypadku jesteśmy przekonani, że problem polega na przerwaniu transferu, co oznacza, że ​​obiekt znajduje się w odległym repozytorium, więc powinniśmy być w stanie bezpiecznie usunąć naszą kopię i pozwolić, żeby Git dostał ją z pilota, tym razem poprawnie .

Tymczasowy plik obiektowy, o zerowym rozmiarze, można oczywiście usunąć. Nic nam to nie pomoże. Zepsuty obiekt, który się do niego odnosi, d4a0e75..., jest naszym prawdziwym problemem. Można go znaleźć w .git/objects/d4/a0e75.... Jak już wspomniałem powyżej, można go bezpiecznie usunąć, ale na wszelki wypadek, najpierw wykonaj kopię zapasową.

W tym momencie powinno się odnieść świeże git pull.

... zakładając, że to się uda. W tym przypadku wygląda na to, że niektóre lokalne modyfikacje uniemożliwiły próbę scalenia, więc porządek był stash,, stash pop. Może się to jednak zdarzyć przy dowolnym scaleniu i nie ma nic wspólnego z uszkodzonym obiektem. (O ile nie było potrzeby czyszczenia indeksu, a robota to zrobiła w tym procesie ... ale ja w to nie wierzę).

+1

Może to spowodować, że 'error: refs/heads/branch nie wskazuje na poprawny obiekt!'. Upewnij się, że wykonasz kopię zapasową. –

5

Recovering from Repository Corruption to oficjalna odpowiedź.

Naprawdę krótka odpowiedź brzmi: znajdź nieuszkodzone obiekty i skopiuj je.

+2

Nie jest to szczególnie pomocne. Zepsuty przedmiot, o którym mowa, prawie na pewno nie wymaga naprawy; to taki, który został częściowo pobrany z pilota. – Cascabel

+0

To był jedyny sposób, który był dla mnie bardzo pomocny. Wielkie dzięki))) –

15

możesz użyć "find", aby usunąć wszystkie pliki w folderze/objects z rozmiarem 0 z komendą find .git/objects/ -size 0 -delete. Zalecana jest kopia zapasowa.

+0

hmm, które pomogły, po zawieszeniu mam kilka obiektów pustych i usunięcie ich pozwoliło mi pobrać prawdziwe obiekty z zdalnego repo. Na szczęście popchnąłem tuż przed zawieszeniem. Jednak aby zobaczyć, co się dzieje z plikami, których jeszcze nie popełniłem, mam nadzieję, że zostały one zsynchronizowane z dyskiem przed zawieszeniem. OSTRZEŻENIE, lepiej zapisać skróty, które usuniesz, jeśli wymagana jest dalsza kontrola. – akostadinov

Powiązane problemy