plik indeksu mniejszy niż oczekiwano

81

Dziś rano zacząłem otrzymywać ten błąd z gita:

fatal: plik indeksu mniejszy niż oczekiwano

fatal: git status --porcelain failed

Masz pojęcie, co się dzieje i jak to rozwiązać?

karellm
źródło
Czy próbowałeś tego vertis.github.com/2012/01/24/…
Gal Bracha
Tak, wypróbowałem to przed wysłaniem. Problem dotyczył moich podmodułów, które ciągle uszkadzały mój plik indeksu (nie wiem dlaczego).
karellm Kwietnia
@karellm Czy dowiedziałeś się, dlaczego tak się dzieje?
crmpicco
Nie, szczerze mówiąc, nie zbadałem, co to spowodowało, i to też przestało się dziać.
karellm
Wskazówka: z mojego doświadczenia wynika, że ​​może to być spowodowane brakiem aktualizacji folderu NFS. Jeśli Twoje repozytorium działa w systemie plików NFS, poczekaj kilka minut, zanim spróbujesz rozwiązać problem. Miałem to po ściągnięciu z jednej maszyny, a następnie sprawdzeniu statusu na innej, obie maszyny montowały ten sam NFS.
ggll

Odpowiedzi:

107

Plik indeksu został uszkodzony, ale można go łatwo odtworzyć. Po prostu go usuń ...

rm .git/index

Następnie możesz ponownie dodać pliki, które próbujesz przygotować.

meagar
źródło
Jak wspomniano powyżej, nie działał z powodu konfliktu z modułem podrzędnym, który raz po raz uszkadzał mój indeks ... Usunąłem moduł podrzędny, usunąłem indeks i dodałem wszystko. W końcu zadziałało. Dzięki!
karellm Kwietnia
3
Dlaczego to się dzieje? W ciągu ostatnich dwóch tygodni zdarzyło mi się to dwukrotnie i nie widzę powodu.
crmpicco
7
To nie zadziałało dla mnie. Przed tym błędem miałem w większości czystą kopię roboczą. Po usunięciu pliku indeksu i uruchomieniu git add .zachowywał się tak, jakby każdy plik był nowy i wymagał zatwierdzenia.
Mark
1
Nie działa też, gdy ma się podmoduł. Po prostu zresetuj (poniżej odpowiedź).
TimZaman
Jeśli git restore --stagedokaże się, że po uruchomieniu tego musiałem zrobić i rozwiązało to problem z myśleniem gita, że ​​wszystko trzeba ponownie
zainstalować
90

Jeśli chcesz zachować lokalne zmiany, użyj:

$ rm .git/index
$ git reset HEAD .

> Unstaged changes after reset:
  modified foo.txt
  modified bar.txt
Scott Paradis
źródło
1
Masz jakiś pomysł, dlaczego tak się dzieje? Zdarzyło mi się to około 4-5 razy w ciągu ostatnich dwóch tygodni.
crmpicco,
1
Ta odpowiedź jest tutaj najlepsza. Dodatkowo, uwaga, jeśli używasz podmodułów git: Usuń również te pliki indeksu (znajdują się w .git/modules/src). To sprawiło, że zacząłem się zastanawiać, dlaczego błąd nadal występuje po usunięciu (głównego) pliku indeksu.
Graftak
Wydaje mi się, że może się to zdarzyć ze standardowych powodów, proces umarł w połowie drogi, zabrakło miejsca na dysku itp. Chociaż w moim przypadku może być tak, że używam dowiązania symbolicznego do folderu git, aby utworzyć katalogi do wykorzystania do budowania zamiast zewnętrznych elementów svn , choć jest to dziwne, ponieważ jedyną operacją na tych repozytoriach jest tylko do odczytu, aby twardy reset folderów kompilacji.
jgmjgm
2

Tym, którzy mają problemy nawet po usunięciu indeksu i nie mogą zrobić resetu. Jeśli chcesz zachować zmiany, wykonaj następujące czynności (nie jest to rozwiązanie, ale raczej brzydkie obejście!).

  1. Zrób kopię zapasową swoich plików. To, co powiem, powinno działać, ale zrób to na wszelki wypadek.
  2. Usuń folder .git
  3. Sklonuj swoje repozytorium (nie ma znaczenia gdzie) Zrobiłem to w bieżącym katalogu
  4. Skopiuj plik utworzony z katalogu clone .git do bieżącego katalogu
  5. Usuń sklonowany katalog 6. Opcjonalnie, jeśli ponownie użyłeś do niego pobierania gałęzi
  6. Status Gita powinien teraz śledzić zmiany tak, jak powinien, a wszystkie twoje polecenia git powinny działać

Mój przypadek był taki, jak opisano powyżej, git pomieszał swoje odniesienia ... Git logpokazywał "Twoja gałąź wydaje się być zepsuta" i git fsckostrzegał mnie o błędnych referencjach. Pomyślałem, że prawdopodobnie mogę to naprawić, ale spędziłbym dużo czasu, robiąc to, więc poszedłem na brzydkie obejście.

Misho Janev
źródło