Cum se rezolvă „Error: bad index – Fatal: index file corrupt” atunci când se utilizează Git (Programare, Git, Corupție)

Numărul8 a intrebat.

După git init, , am adăugat și am confirmat câteva fișiere, am făcut câteva modificări, am adăugat și am confirmat. Am configurat daimonul git (care rulează sub Cygwin pe WinXP) și am clonat depozitul o dată. acum, primesc această eroare cu depozitul clonat:

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

Există vreo modalitate de a remedia acest lucru, în afară de obținerea unei noi copii a depozitului?

Comentarii

  • Este vorba de depozitul clonat sau de depozitul original? Comanda de clonare a produs vreo eroare? –  > Por CB Bailey.
14 răspunsuri
Jakub Narębski

În cazul în care problema este cu indexul ca zona de pregătire a comenzilor (i.e. .git/index), puteți pur și simplu să eliminați indexul (faceți o copie de rezervă dacă doriți), iar apoi restaurați indexul la versiunea din ultimul commit:

Pe OSX/Linux:

rm -f .git/index
git reset

Pe Windows:

del .gitindex
git reset

(În reset de mai sus este aceeași cu git reset --mixed HEAD)

Puteți utiliza alternativ un nivel inferior instalații sanitare git read-tree în loc de git reset.


În cazul în care problema este cu index pentru packfile, , îl puteți recupera folosind git index-pack.

Comentarii

    27

  • Am făcut din greșeală un :w! într-un :Gstatus (din fugitiv.vim). Acest răspuns m-a scutit de multe trasul de păr. –  > Por Laurence Gonsalves.
  • Știu că nu ne plac mesajele cu „și eu” – dar „și eu”. Echivalentul în Windows este erase /s .gitindex, , aveam nevoie de un erase .gitindex.lock prea. –  > Por Jeremy McGee.
  • Bună, am avut aceeași problemă cu find and replace, dar git reset îmi spune că există două fișiere pack în .git/objects/pack/ care nu pot fi accesate. Aveți vreo idee ? –  > Por epsilones.
  • nu ar fi mai sigur să folosiți git reset --keep în schimb? În Tower Git Cheat Sheet se explică astfel: Resetează pointerul HEAD la o confirmare anterioară și păstrează modificările locale nevalidate. –  > Por Pjetr.
  • Nu exista când am scris acest răspuns… Oricum, git reset --keep este o formă mai sigură de git reset --hard; git reset --mixed nu se atinge deloc de workdir. –  > Por Jakub Narębski.
hobs

Este posibil să fi corupt din greșeală fișierul .git/index cu un sed pe rădăcina proiectului tău (refactoring, poate?) cu ceva de genul:

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

pentru a evita acest lucru pe viitor, ignorați doar fișierele binare cu grep/sed:

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

Comentarii

  • Dacă nu vă deranjează să pierdeți modificările din .git/index, , puteți oricând să îl ștergeți și să îl recreați cu git reset (fără --hard!). –  > Por Jakub Narębski.
  • Am spart-o cu # find ./ -type f -exec sed -i ‘s/Politician/Legislator/g’ {} ; Făcând ceea ce acest răspuns recomandă acest lucru nu l-ar fi stricat în primul rând, dar răspunsul acceptat a reparat daunele pe care le-am făcut. Aceasta este totuși o prevenție excelentă. –  > Por Ryan Mortensen.
  • @RyanMortensen Ați putea încerca să inversați sed cu ceva de genul find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} ; Acest lucru ar putea ajuta dacă .git/ este atât de corupt încât git reset nu va funcționa. Sau poate doriți să restaurați fișierul existent .git/index fără a o șterge. Acest lucru va eșua, desigur, dacă codul sau indexul original conținea deja niște „Legislator „s în el. –  > Por hobs.
  • Mulțumesc @hobs, m-ai salvat de multe probleme – am rezolvat problema inversând sed prin înlocuirea new_string cu my old_string! –  > Por tsveti_iko.
  • Mi-am refactorizat întregul proiect în loc de folderul ‘src’ din IntelliJ și am avut această problemă. Acest lucru explică de ce am avut astfel de erori ciudate! –  > Por Michael.
Cleiton Almeida

Am avut această problemă și am încercat să o rezolv cu acest lucru:

rm -f .git/index
git reset

DAR nu a funcționat. Soluția?Din anumite motive am avut alte foldere .git în subdirectoare. Am șters acele foldere .git (nu și principalul) și git reset din nou. După ce au fost șterse, totul a funcționat din nou.

Comentarii

  • Acest răspuns rezolvă cu adevărat problema dacă aveți unele foldere .git în vendor/ (e.x.) –  > Por AlSan.
Gav

Asta sună ca o clonă proastă. Ați putea încerca următoarele pentru a obține (posibil?) mai multe informații:

git fsck --full

eskimwier

Deoarece soluțiile de mai sus m-au lăsat cu probleme continue, am folosit această soluție plictisitoare:

  1. să clonez o nouă copie a repo-ului în altă parte
  2. să copiez noul director .git în repo-ul (stricat) care conținea modificările pe care voiam să le comit

A făcut trucul. Btw, am făcut un sed pe rădăcina proiectului, așa cum a intuit @hobs. Mi-am învățat lecția.

Comentarii

  • Asta e genial 🙂 –  > Por Jeremy Belolo.
  • Nu este cu adevărat genial dacă erați în mijlocul unei fuziuni, dacă ați creat ramuri sau dacă ați emis vreo confirmare de la clonare, sau în oricare dintre numeroasele alte scenarii… Clonarea unei noi copii a repo-ului nu este deloc o soluție și îndrăznesc să spun că miroase a nerăbdare (cel mai bine este să te lași atunci când ești cu adevărat în dificultate). Este mult mai bine să diagnosticați ce se întâmplă și să reparați indexul repo-ului existent – de obicei, acest lucru este relativ ușor de făcut. Uneori, poți doar să redenumești fișierul index (sau să-l ștergi, dacă ești sigur că nu vei mai avea nevoie de el) și să lași Git să creeze unul nou (folosind git-reset sau git-checkout)… –  > Por Jazimov.
Optzeci

Acest lucru a funcționat pentru mine. Deși sunt curios de motivul pentru care am început să primesc erori în primul rând. Când m-am deconectat ieri, era în regulă. Când m-am logat azi dimineață, nu era.

rm .git/index

git reset

Comentarii

  • Acest lucru a funcționat pentru mine, Deși a eliminat toate fișierele adăugate din git. A trebuit să rulez git add pentru acele fișiere –  > Por Shamsul Arefin Sajib.
jenming

Notă pentru utilizatorii de submodule git – soluțiile de aici nu vor funcționa pentru voi așa cum sunt.

Să spunem că aveți un depozit părinte numit dev, , de exemplu, iar depozitul submodulelor se numește api.

dacă vă aflați în interiorul lui api și primiți eroarea menționată în această întrebare:

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

index NU se va afla în interiorul unui fișier .git dosar. De fapt, fișierul .git nu va fi nici măcar un folder – va fi un document text cu locația datelor .git reale pentru acest depozit. Probabil ceva de genul acesta:

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

Așadar, în loc de rm -f .git/index, , va trebui să faceți așa:

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

sau, mai general,

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

Nick Kuijpers

Această problemă poate apărea atunci când există un .git sub unul dintre subdirectoare. Pentru a remedia problema, verificați dacă există alte directoare .git acolo, eliminați-le și încercați din nou.

Comentarii

  • Mai multe alte răspunsuri au furnizat deja aceste informații. –  > Por Simon Forsberg.
Ash

Nici unul dintre răspunsurile existente nu a funcționat pentru mine.

Foloseam worktrees, deci nu există un dosar .git.

Va trebui să te întorci la repo-ul tău principal. În interiorul acestuia, ștergeți .git/worktrees/<name_of_tree>/index

Apoi rulați git reset conform celorlalte răspunsuri.

Kornel

Un repo poate părea corupt dacă amestecați diferite git versiuni diferite.

Depozitele locale atinse de noile versiuni git nu sunt compatibile cu versiunile git vechi. Noile depozite git par corupte față de vechile versiuni git (în cazul meu, git 2.28 a stricat repo-ul pentru git 2.11).

Actualizarea vechii versiuni git poate rezolva problema.

Astra Uvarova – Steaua lui Saturn

Am făcut un truc simplu. Am clonat repo-ul într-un folder nou. Am copiat folderul .git din noul folder în vechiul folder al repo-ului, înlocuind .git acolo.

Comentarii

  • Foarte periculos, deoarece va șterge date precum commits nepublicate, tag-uri și ramuri, precum și stashes și reflogul. –  > Por Koraktor.
  • Nu sunt sigur în ceea ce privește comenzile nepublicate, deoarece cred că acestea sunt stocate în dosarul .git și am copiat dosarul .git. Nu am pierdut nimic cu această metodă. Nu știu despre stashes și reflog pentru a face orice comentariu în acest sens. –  > Por Astra Uvarova – Steaua lui Saturn.
  • Ai dreptate, dar poate ar trebui să subliniezi că ai făcut o clonare locală. Dar comentariul meu este valabil în continuare pentru stashes și reflog. –  > Por Koraktor.
  • Bine, nu am experiență în legătură cu acest comentariu nimic mai departe, totuși, a funcționat pentru mine și unii utilizatori ar putea găsi util. Nu este nevoie să îl downvotezi. –  > Por Astra Uvarova – Steaua lui Saturn.
Christopher Shaw
rm -f .git/index
git reset

Mai multe informații la https://www.chris-shaw.com/blog/quick-fix-for-git-corrupt-index

Comentarii

  • Mai multe alte răspunsuri au furnizat deja aceste informații. –  > Por Simon Forsberg.
Herman Leus

Acest lucru este ridicol, dar tocmai mi-am repornit mașina (mac) și problema a dispărut ca și cum nu s-ar fi întâmplat niciodată. Nu-mi place să par un tip de asistență…

Shyamsundar

Puteți încerca, de asemenea, pentru restaurarea la versiunea anterioară a fișierului (dacă utilizați windows os)

Comentarii

  • Nu puneți un răspuns pe care nu îl cunoașteți. –  > Por Altaf Patel.