Ilekroć wyciągam z pilota, pojawia się następujący błąd dotyczący kompresji. Po uruchomieniu kompresji ręcznej otrzymuję to samo:
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack
Czy ktoś wie, co z tym zrobić?
Z pliku cat otrzymuję to:
$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file
I z git fsck otrzymuję to (nie wiem, czy to jest rzeczywiście powiązane):
$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted
Czy ktoś może mi pomóc to rozszyfrować?
git
version-control
asgerhallas
źródło
źródło
Odpowiedzi:
Wygląda na to, że masz uszkodzony obiekt drzewa. Musisz zdobyć ten obiekt od kogoś innego. Mam nadzieję, że będą miały niezniszczoną wersję.
Możesz go zrekonstruować, jeśli nie możesz znaleźć prawidłowej wersji od innej osoby, zgadując, jakie pliki powinny tam być. Możesz sprawdzić, czy daty i godziny obiektów odpowiadają temu. Mogą to być powiązane obiekty BLOB. Z tych obiektów można wywnioskować strukturę obiektu drzewa.
Spójrz na Git Screencasts Scott Chacon dotyczące wewnętrznych elementów gita. To pokaże ci, jak git działa pod maską i jak wykonać tę pracę detektywistyczną, jeśli naprawdę utkniesz i nie możesz dostać tego obiektu od kogoś innego.
źródło
git cat-file -t <SHA1>
powie ci typ. Jeśli nie jest zepsuty, możesz zrobić to,git cat-file <type> <SHA1>
aby zobaczyć zawartość (użyłem go przezblob
, myślę, że pokaże ci także zawartość innych typów).blob
. Kiedy jednak wykonałem te instrukcje,git status
odpowiedziałem,fatal: unable to read <SHA1>
mimo że udało mi się uruchomićgit hash-object -w <file>
(prawdopodobnie dlatego, że zgodnie z jego instrukcjami usunąłem ten plik obiektowy. Zwrócenie go tylko dało mi ten samcorrupt loose object
błąd.)Miałem ten sam problem (nie wiem dlaczego).
Ta poprawka wymaga dostępu do nieuszkodzonej zdalnej kopii repozytorium i utrzymuje lokalną kopię roboczą w stanie nienaruszonym.
Ma jednak pewne wady:
Poprawka
Wykonaj te polecenia z katalogu nadrzędnego nad repozytorium (zamień „foo” na nazwę folderu projektu):
cp -R foo foo-backup
git clone [email protected]:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
W systemie Windows musisz użyć:
copy
zamiastcp -R
rmdir /S
zamiastrm -rf
move
zamiastmv
Teraz foo ma swój oryginalny
.git
podkatalog, ale wszystkie lokalne zmiany nadal tam są.git status
,commit
,pull
,push
, Itd. Praca znowu tak, jak powinny.źródło
.git
folderu.Najlepszym rozwiązaniem jest prawdopodobnie ponowne klonowanie ze zdalnego repozytorium (np. Github lub innego). Niestety utracisz nieprzypisane zatwierdzenia i ukryte zmiany, jednak kopia robocza powinna pozostać nienaruszona.
Najpierw wykonaj kopię zapasową lokalnych plików. Następnie zrób to z katalogu głównego działającego drzewa:
Następnie w razie potrzeby zatwierdz wszystkie zmienione pliki.
źródło
master
na nazwę swojej gałęzi.working
kiedy był uszkodzony, a te kroki nie dały mi lokalnej kopii żadnej gałęzi innej niż master (i tak, próbowałem zastąpić master powyżej,working
ale to nie działało). Skończyło się na wykonaniu powyższych krokówmaster
, a następnie ukryciu moich zmian oraz zrobieniucheckout -b working origin/working
i włożeniu skrytki. Wygląda na to, że zadziałało - dzięki!git status
otrzymanofatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. Usunięcie submodułu z systemu plików i ponowne uruchomienie procesu przywróciło normalność. Prawdopodobnie upewnienie się, że najpierw nie maPracując na maszynie wirtualnej, w moim notebooku bateria się skończyła, wystąpił ten błąd;
Udało mi się sprawić, że repo znów działa z tylko 2 poleceniami i bez utraty pracy (zmodyfikowane pliki / niezatwierdzone zmiany)
Potem prowadziłem
git status
, repo było w porządku i były moje zmiany (czekam na zatwierdzenie, zrób to teraz ...).wersja git 1.9.1
Pamiętaj, aby wykonać kopię zapasową wszystkich zapamiętanych zmian, na wypadek, gdyby to rozwiązanie nie działało i potrzebne jest bardziej radykalne podejście.
źródło
find .git/objects/ -size 0 -exec rm -f {} \;
działa dla mnie;)git symbolic-ref HEAD refs/heads/master.
po usunięciu pustych obiektów.Mój komputer zawiesił się podczas pisania wiadomości zatwierdzenia. Po ponownym uruchomieniu działające drzewo wyglądało tak, jak je zostawiłem i mogłem pomyślnie zatwierdzić zmiany.
Jednak kiedy próbowałem uciec
git status
, dostałemW przeciwieństwie do większości innych odpowiedzi, nie próbowałem odzyskać żadnych danych . Potrzebowałem tylko Gita, żeby przestał narzekać na pusty plik obiektowy.
Przegląd
„Plik obiektowy” to haszowana reprezentacja rzeczywistego pliku, na którym ci zależy. Git uważa, że powinna być w nim
some/file.whatever
zapisana zaszyfrowana wersja.git/object/xx/12345
, a naprawienie błędu polegało głównie na ustaleniu, który plik „luźny obiekt” miał reprezentować.Detale
Wydawało się, że możliwe są opcje
Podejście 1: Usuń plik obiektowy
Pierwszą rzeczą, jakiej próbowałem, było przeniesienie pliku obiektowego
To nie zadziałało - git zaczął narzekać na zepsuty link. Przejdź do podejścia 2.
Podejście 2: Napraw plik
Linus Torvalds świetnie napisał, jak odzyskać plik obiektowy, który rozwiązał dla mnie problem. Kluczowe kroki zostały podsumowane tutaj.
To powie ci, jaki plik ma być skrótem pustego obiektu. Teraz możesz to naprawić.
Po zrobieniu tego sprawdziłem
.git/objects/xx/12345
, że nie jest już pusty, a git przestał narzekać.źródło
Próbować
To zadziałało dla mnie. Ukrywa wszystko, czego nie popełniłeś i co pomijało problem.
źródło
git stash
Wykonano następujące czynności: ... fatal: Nie można utworzyć „/ home / <user> /.git/index.lock”: Błąd wejścia / wyjściatouch .git/a
dotknąć: nie można dotknąć „.git / a”: Błąd wejścia / wyjściasudo touch /home/guest/.git/a
NIE BŁĄDgit stash
Nie lokalne zmiany do zapisaniagit status
... nic do zatwierdzenia, czysty katalog roboczyZbieranie śmieci stały mój problem:
Trwa trochę czasu, ale każdy luźny obiekt i / lub uszkodzony indeks został naprawiony.
źródło
po prostu
git prune
naprawiłem ten problemźródło
git pull
trwa nieco dłużej niż zwykle, ponieważ zastępuje niektóre usunięte obiekty lub coś.Właśnie tego doświadczyłem - moja maszyna uległa awarii podczas pisania do repozytorium Git i uległa uszkodzeniu. Naprawiłem to w następujący sposób.
Zacząłem od sprawdzenia, ile zatwierdzeń nie wypchnąłem do zdalnego repozytorium, a zatem:
Jeśli nie korzystasz z tego narzędzia, jest ono bardzo przydatne - dostępne, o ile wiem, we wszystkich systemach operacyjnych. Oznaczało to, że mój pilot nie miał dwóch zatwierdzeń. Dlatego kliknąłem etykietę wskazującą ostatnie zdalne zatwierdzenie (zwykle tak będzie
/remotes/origin/master
), aby uzyskać skrót (skrót ma 40 znaków, ale dla zwięzłości używam tutaj 10 - i tak zazwyczaj działa).Oto on:
Następnie klikam następujące zatwierdzenie (tj. Pierwsze, którego nie ma pilot) i tam mam skrót:
Następnie używam obu z nich, aby zrobić łatkę dla tego zatwierdzenia:
Następnie zrobiłem podobnie z innym brakującym zatwierdzeniem, tj. Użyłem skrótu wcześniejszego zatwierdzenia i skrótu samego zatwierdzenia:
Następnie przeniosłem się do nowego katalogu, sklonowałem repozytorium ze zdalnego:
Następnie przeniosłem pliki łatek do nowego folderu, zastosowałem je i zatwierdziłem ich dokładnymi komunikatami zatwierdzenia (można je wkleić z okna
git log
lub wgitk
oknie):To przywróciło mi rzeczy (i zauważ, że istnieje prawdopodobnie szybszy sposób na zrobienie tego dla dużej liczby zatwierdzeń). Chciałem jednak sprawdzić, czy drzewo w uszkodzonym repozytorium można naprawić, a odpowiedź brzmi: tak. Przy naprawionym repozytorium dostępnym jak wyżej, uruchom to polecenie w uszkodzonym folderze:
Otrzymasz coś takiego:
Aby wykonać naprawę, zrobiłbym to w uszkodzonym folderze:
tzn. usuń uszkodzony plik i zastąp go dobrym. Być może będziesz musiał to zrobić kilka razy. Wreszcie będzie punkt, w którym będziesz mógł biegać
fsck
bez błędów. Prawdopodobnie będziesz mieć w raporcie wiersze „zwisające zatwierdzenie” i „zwisające kropelki”, są one konsekwencją twoich zmian i poprawek w tym folderze i są OK. Śmieciarka usunie je w odpowiednim czasie.Zatem (przynajmniej w moim przypadku) zepsute drzewo nie oznacza, że niepoprawne zatwierdzenia zostały utracone.
źródło
Otrzymałem również uszkodzony błąd luźnego obiektu.
Udało mi się to naprawić, wchodząc do katalogu uszkodzonego obiektu. Widziałem, że użytkownicy przypisani do tego obiektu nie byli moim użytkownikiem git. Nie wiem, jak to się stało, ale uruchomiłem
chown git:git
ten plik, a potem znowu zadziałał.Może to być potencjalna poprawka dla problemów niektórych ludzi, ale niekoniecznie dla wszystkich.
źródło
Ten błąd wystąpił po tym, jak moja maszyna (Windows) postanowiła zrestartować się. Na szczęście moje zdalne repozytorium było aktualne, więc właśnie wykonałem świeżego klon git.
źródło
Runnning
git stash; git stash pop
naprawił mój problemźródło
Wykonałem wiele innych kroków tutaj; Szczególnie pomocny był opis Linusa, w jaki sposób spojrzeć na drzewo / obiekty git i znaleźć to, czego brakuje. git-git odzyskuje uszkodzony obiekt blob
Ale ostatecznie dla mnie miałem luźne / uszkodzone obiekty drzewa spowodowane częściową awarią dysku, a obiekty drzewa nie są tak łatwo odzyskiwać / nie są objęte tym dokumentem.
Ostatecznie usunąłem konflikt
objects/<ha>/<hash>
z drogi i użyłem gogit unpack-objects
z plikiem paczki z dość aktualnego klonu. Był w stanie przywrócić brakujące obiekty drzewne.Wciąż pozostawiło mi wiele zwisających kropelek, które mogą być efektem ubocznym rozpakowywania wcześniej zarchiwizowanych rzeczy i poruszone w innych pytaniach tutaj
źródło
W odpowiedzi na @ user1055643 brakuje ostatniego kroku:
źródło
.git
i skopiujesz ze sklonowanego projektu, repo będzie działać, ale nie zostaną zachowane żadne lokalne oddziały ani zapasy.Właśnie mieliśmy tu sprawę. Zdarzyło się, że problem polegał na tym, że właścicielem uszkodzonego pliku był root zamiast naszego zwykłego użytkownika. Było to spowodowane zatwierdzeniem dokonanym na serwerze po tym, jak ktoś zrobił „sudo su -”.
Najpierw zidentyfikuj uszkodzony plik za pomocą:
Powinieneś otrzymać odpowiedź taką jak ta:
Przejdź do folderu, w którym znajduje się uszkodzony plik i wykonaj:
Sprawdź własność uszkodzonego pliku. Jeśli jest inaczej, po prostu wróć do katalogu głównego repozytorium i wykonaj:
Mam nadzieję, że to pomoże!
źródło
Dla mnie stało się to z powodu awarii zasilania podczas robienia
git push
.Wiadomości wyglądały tak:
Próbowałem takich rzeczy,
git fsck
ale to nie pomogło. Ponieważ awaria nastąpiła podczas agit push
, oczywiście stało się to podczas przepisywania po stronie klienta, co dzieje się po aktualizacji serwera. Rozejrzałem się dookoła i doszedłem do wniosku, żec2388
w moim przypadku był to obiekt zatwierdzenia, ponieważ do niego odwoływały się wpisy w.git/refs
. Wiedziałem więc, że będę mógł je znaleźć,c2388
kiedy spojrzę na historię (przez interfejs sieciowy lub drugi klon).Na drugim klonie zrobiłem a,
git log -n 2 c2388
aby zidentyfikować poprzednikac2388
. Następnie ręcznie zmodyfikowałem.git/refs/heads/master
i zamiast tego byłem.git/refs/remotes/origin/master
poprzednikiem . Wtedy mógłbym zrobić . Powiodło się kilka razy do konfliktów na pustych obiektów. Usunąłem każdy z tych pustych obiektów, dopóki się nie udało. To wyleczyło repozytorium.c2388
c2388
git fetch
git fetch
git fetch
źródło
Rozwiązałem w ten sposób: postanowiłem po prostu skopiować nieuszkodzony plik obiektowy z klonu kopii zapasowej do mojego oryginalnego repozytorium. To działało równie dobrze. (Nawiasem mówiąc: Jeśli nie możesz znaleźć obiektu w .git / objects / według jego nazwy, prawdopodobnie został on [spakowany] [paczka], aby zaoszczędzić miejsce.)
źródło
Miałem ten sam problem w moim nagim zdalnym repozytorium git. Po wielu problemach zorientowałem się, że jeden z moich współpracowników dokonał zatwierdzenia, w którym niektóre pliki w .git / objects miały uprawnienia 440 (r - r -----) zamiast 444 (r - r - r -). Po poproszeniu współpracownika o zmianę uprawnień za pomocą „obiektów chmod 444 -R” wewnątrz repozytorium git, problem został naprawiony.
źródło
Właśnie miałem taki problem. Mój szczególny problem został spowodowany przez awarię systemu, która spowodowała uszkodzenie ostatniego zatwierdzenia (a więc i gałęzi master). Nie naciskałem i chciałem ponownie dokonać tego zatwierdzenia. W moim szczególnym przypadku mogłem sobie z tym poradzić w następujący sposób:
.git/
:rsync -a .git/ git-bak/
.git/logs/HEAD
i znajdź ostatni wiersz z prawidłowym identyfikatorem zatwierdzenia. Dla mnie było to drugie ostatnie zatwierdzenie. To było dobre, ponieważ nadal miałem wersje katalogu roboczego pliku, a więc każdą wersję, której chciałem.git branch temp <commit-id>
git reset master temp
aby przenieść gałąź master do nowego zatwierdzenia dokonanego w kroku 2.git checkout master
i sprawdź, czy wygląda poprawniegit log
.git branch -d temp
.git fsck --full
, i teraz powinno być bezpiecznie usuwać uszkodzone obiekty znalezione przez fsck.To działało dla mnie. Podejrzewam, że jest to dość powszechny scenariusz, ponieważ najprawdopodobniej najnowszy zatwierdzenie jest uszkodzony, ale jeśli stracisz jeszcze jedną pozycję wstecz, prawdopodobnie nadal możesz użyć takiej metody, ostrożnie ją wykorzystując
git cherrypick
i przeprogramować w.git/logs/HEAD
.źródło
Kiedy miałem ten problem, utworzyłem kopię zapasową moich ostatnich zmian (ponieważ wiedziałem, co zmieniłem), a następnie usunąłem ten plik, na który narzekałem w .git / location. Potem zrobiłem dupek. Uważaj jednak, może to nie działać.
źródło
Spotkałem to, gdy mój system się zawiesił. Zrobiłem to:
(Pamiętaj, że twoje uszkodzone zatwierdzenia zostały utracone, ale zmiany zostały zachowane. Być może będziesz musiał odtworzyć te zatwierdzenia na końcu tej procedury)
.git
folder..git
folder.źródło
Wystarczy usunąć folder .git i dodać go ponownie. To proste rozwiązanie zadziałało dla mnie.
źródło
.git
i skopiujesz ze sklonowanego projektu, repo będzie działać, ale żadne lokalne oddziały ani skrytki nie zostaną zachowane. Również przyjazna sugestia, usuń całkowicie swoją odpowiedź, aby przestać otrzymywać głosy negatywne.