2014-08-27 29 views
7

Jest to jeden z licznych pytań dotyczących repo Git, który jest uszkodzony, właśnie luźne obiektu, który poszedł źle:Git uszkodzone repo: jak wybrać obiekt git z czystym repozytorium

$ git gc 
Counting objects: 3299, done. 
error: inflate: data stream error (unknown compression method) 
error: unable to unpack 831a5d31af4a0af2f5a367689bee27a44efc22c9 header 
Delta compression using up to 6 threads. 
Compressing objects: 100% (3283/3283), done. 
error: inflate: data stream error (unknown compression method) 
fatal: loose object 831a5d31af4a0af2f5a367689bee27a44efc22c9 (stored in .git/objects/83/1a5d31af4a0af2f5a367689bee27a44efc22c9) is corrupt 
error: failed to run repack 

Następujące istniejące odpowiedzi na ten temat (How do I deal with corrupted git object files?, How to fix corrupted git repository? lub What can I do with Git corruption due to a missing object?) Usunąłem już obiekt 831a5d31 z uszkodzonego repozytorium.

W moim przypadku mam klon repozytorium, który wydaje się posiadać obiekt, którego mi brakuje, ale nie ma pliku pod adresem objects/83/1a5d31af4a0af2f5a367689bee27a44efc22c9. Jak mogę naprawić moje repozytorium?

Odpowiedz

10

Jeśli plik istnieje gdzie indziej

przedmiotu czystej repozytorium zostały przepakowane, to dlatego, że już nie istnieje jako plik.

Aby przywrócić go najpierw zapisać go jako plik, z czystym repozytorium, z

git show 831a5d31af4a0af2f5a367689bee27a44efc22c9 > 831a5-file 

Move 831a5-file w uszkodzonej repo i uruchom

git hash-object -w 831a5-file 

Upewnij się, że SHA1 podano na wyjściu jest 831a5d31af4a0af2f5a367689bee27a44efc22c9

To zapisze obiekt, a repozytorium zostanie naprawione!

Jeśli plik nie istnieje gdzie indziej

Jeśli plik nie istnieje gdzie indziej, czyli korupcja wystąpiły po popełnić ale zanim udało się wcisnąć, istnieje sposób, aby przywrócić i repo i ponownie zatwierdzić zmiany. Zobacz this answer na pokrewne pytanie.

+0

Działa to w przypadku obiektów typu blob; czy istnieje sposób na importowanie/eksportowanie obiektów drzewa? – fuzzyTew

+1

Aby odpowiedzieć na własne pytanie, aby zrobić to dla obiektów drzewa itp: 'git drzewo-plik cat > temp' ' git hash-object -t drzewo -w temp' – fuzzyTew

+1

Dzięki, uratowałeś moje repo! Zauważ, że jeśli twoje czyste repozytorium pochodzi z innego systemu operacyjnego, SHA1 może nie pasować, jeśli zakończenia linii nie są takie same w różnych systemach operacyjnych. Rozwiązanie nadal działało. – mrm