2009-07-12 7 views
442

Po git init dodałem i zatwierdziłem kilka plików, wprowadziłem pewne zmiany, dodałem i zatwierdzono. Skonfiguruj demona git (działającego pod Cygwin na WinXP) i sklonuj repozytorium jeden raz. Teraz mam ten błąd ze sklonowanego repozytorium:Jak rozwiązać problem "Błąd: zły indeks - Fatal: plik indeksu uszkodzony" podczas korzystania z Git

$ git status 
error: bad index file sha1 signature 
fatal: index file corrupt 

Czy istnieje jakiś sposób, aby rozwiązać ten problem, inne niż uzyskanie nowej kopii repozytorium?

+0

Czy to w sklonowanym repozytorium lub w oryginalnym repozytorium? Czy polecenie klonu wyprowadziło jakieś błędy? –

Odpowiedz

884

Jeśli problem jest z indeksem jak obszar inscenizacja dla popełnia (tj .git/index), można po prostu usunąć z indeksu (zrobić kopia zapasowa, jeśli chcesz), a następnie odtworzyć indeks do wersji w ostatnim popełnić:

na OSX/Linux:

rm -f .git/index 
git reset 

w systemie Windows:

del .git\index 
git reset 

(Polecenie reset powyżej, jest takie samo jak git reset --mixed HEAD)

można alternatywnie stosować niższe poziom plumbinggit read-tree zamiast git reset.


Jeśli problem jest z indeksu dla packfile, można go odzyskać używając git index-pack.

+25

Przypadkowo zrobiłem ': w!' W ': Gstatus' (from fugitive.vim). Ta odpowiedź zaoszczędziła mi wielu włosów. –

+3

Wiem, że nie lubimy wiadomości "ja też" - ale też "ja też". Odpowiednikiem w Windows jest 'erase/s .git \ index', potrzebowałem też' erase .git \ index.lock'. –

+0

Musiałem użyć rm .git/index, ponieważ otrzymałem niejednoznaczne ostrzeżenie za pomocą -f –

12

To brzmi jak zły klon. Można wypróbować następujące czynności, aby uzyskać więcej informacji (ewentualnie):

git fsck --full 
68

mogłeś przypadkowo uszkodzony plik .git/indeksu o sed na korzeniu projektu (refactoring może?) Z czymś takim:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT") 

tego uniknąć w przyszłości, po prostu zignorować plików binarnych Twój grep/sed:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT") 
+3

Jeśli nie masz nic przeciwko utracie zmian w '.git/index', zawsze możesz go usunąć i odtwarzaj z 'git reset' (bez' --hard'!). –

+1

Złamałem to przy pomocy # find ./ -type f -exec sed -i 's/Polityk/Prawodawca/g' {} \; Czynienie tego, co ta odpowiedź zaleca, nie zniszczyłoby tego w pierwszej kolejności, ale zaakceptowana odpowiedź naprawiła szkody, które zrobiłem. To jednak doskonała prewencja. –

+0

@RyanMortensen Możesz spróbować odwrócić swoje 'sed' z czymś takim jak' find .git/-type f -exec sed -i 's/Legislator/Politician/g' {} \; 'To może pomóc, jeśli twój plik .git/'jest tak uszkodzony, że' git reset' nie będzie działał. A może chcesz przywrócić istniejący '.git/index' bez usuwania go. To oczywiście nie powiedzie się, jeśli w twoim pierwotnym kodzie lub indeksie był już jakiś "prawodawca". – hobs

-6

można również spróbować przywrócić do poprzedniej wersji pliku (jeśli używasz systemu operacyjnego Windows)

+0

Nie wkładaj odpowiedzi, której nie znasz. –

6

miałem ten problem, a ja staram się naprawić ti to:

rm -f .git/index 
git reset 

ALE to nie zadziałało. Rozwiązanie? Z jakiegoś powodu miałem inne .git foldery w podkatalogach. Usuwam ponownie te foldery .git (nie główny) i git reset. Po ich usunięciu wszystko znów działało.

9

W moim przypadku było zagnieżdżone .git folder web/CKEditor/kcfinder

git status 
    error: bad index file sha1 signature 
    fatal: index file corrupt 
    fatal: 'git status --porcelain' failed in submodule web/ckeditor/kcfinder 
+1

Jeśli jest to przyczyną problemu, natychmiast po uruchomieniu 'git reset' plik indeksu będzie ponownie uszkodzony ... W opublikowanym wyjściu, zagnieżdżony folder .git to" web/ckeditor/kcfinder /. git' (git mówi ci, gdzie zlokalizować folder w trzeciej linii). Powinieneś usunąć folder i uruchomić 'git reset' później –

3

Ten problem może wystąpić, gdy istnieje .git katalog pod jednym z podkatalogów. Aby to naprawić, sprawdź, czy istnieją inne katalogi .git, i usuń je i spróbuj ponownie.

2

To zadziałało dla mnie. Chociaż jestem ciekawy powodów, dla których zacząłem otrzymywać błędy w pierwszej kolejności. Kiedy wylogowałem się wczoraj, było w porządku. Zaloguj się dziś rano, ale nie było.

rm .git/index 

git reset 
2

Ponieważ powyższe rozwiązania zostawiła mnie z cd problemów, kiedyś ten tępy rozwiązanie:

  1. klon nowy egzemplarz repo gdzie indziej
  2. skopiowania świeżego katalogu .git w przycisk (złamany) repo, które zawierało zmiany, które chciałem zatwierdzić:

Zrobiłem lewę. Btw, zrobiłem sed na głównym katalogu projektu, jak się domyślił @hobs. Nauczyłem się mojej lekcji.

+0

To jest genialne :) –

+0

To nie jest naprawdę genialne, jeśli byłeś w środku scalenia, utworzyłeś oddziały lub wydałeś jakieś zatwierdzenia od czasu klonowania lub którekolwiek z wielu innych Scenariusze ... Klonowanie nowej kopii repo to nie jest rozwiązanie i śmiem twierdzić, że to niecierpliwość (najlepiej, gdy jest w szczypie). Znacznie lepiej jest zdiagnozować, co się dzieje, i naprawić istniejący indeks repo - zwykle jest to stosunkowo łatwe. Czasami możesz zmienić nazwę pliku indeksu (lub go usunąć, jeśli jesteś pewien, że nigdy go nie potrzebujesz) i pozwolić Gitowi utworzyć nowy (używając git-reset lub git-checkout). – Jazimov

-1

To jest niedorzeczne, ale po prostu zrestartowałem komputer (Mac) i problem zniknął, jakby nigdy się nie wydarzył. Nienawidzę brzmieć jak wsparcie faceta ...

0

Uwaga dla użytkowników git modułem - tutaj rozwiązania nie będzie pracować dla Ciebie jak jest.

Załóżmy, że masz na przykład repozytorium rodziców o nazwie dev, a repozytorium częściowe to api.

jeśli jesteś wewnątrz api i pojawia się błąd, o którym mowa w pytaniu:

error: bad index file sha1 signature fatal: index file corrupt

Plik index nie będzie wewnątrz folderu .git. W rzeczywistości, .git nie będzie nawet folderem - będzie to dokument tekstowy z lokalizacją prawdziwych danych .git dla tego repozytorium. Prawdopodobnie coś takiego:

~/dev/api $ cat .git gitdir: ../.git/modules/api

Więc zamiast rm -f .git/index, trzeba będzie to zrobić:

rm -f ../.git/modules/api/index git reset

lub, bardziej ogólnie,

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git reset