Cara mengatasi "Kesalahan: indeks buruk - Fatal: file indeks rusak" saat menggunakan Git


611

Setelah itu git init, saya menambahkan dan melakukan beberapa file, membuat beberapa perubahan, menambahkan dan melakukan. Atur daemon git (berjalan di bawah Cygwin pada WinXP) dan kloning repositori sekali. Sekarang, saya mendapatkan kesalahan ini dengan repositori kloning:

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

Apakah ada cara untuk memperbaikinya, selain mendapatkan salinan baru dari repositori?


Apakah ini di repositori kloning, atau di repositori asli? Apakah perintah klon menghasilkan kesalahan?
CB Bailey

Jawaban:


1258

Jika masalah dengan indeks sebagai area pementasan untuk komit (yaitu .git/index), Anda bisa menghapus indeks (membuat salinan cadangan jika Anda mau), dan kemudian mengembalikan indeks ke versi di komit terakhir:

Di OSX / Linux:

rm -f .git/index
git reset

Di Windows:

del .git\index
git reset

( resetPerintah di atas sama dengan git reset --mixed HEAD)

Anda alternatif dapat menggunakan tingkat yang lebih rendah pipa git read-tree bukan git reset.


Jika masalah dengan indeks untuk packfile , Anda dapat memulihkannya menggunakan git index-pack.


27
Saya tidak sengaja melakukan :w!in :Gstatus(dari fugitive.vim). Jawaban ini menyelamatkan saya dari banyak penarik rambut.
Laurence Gonsalves

5
Saya tahu kami tidak suka pesan "saya juga" - tetapi "saya juga". Setara dengan Windows erase /s .git\index, saya juga butuh erase .git\index.lock.
Jeremy McGee

1
Hai, Saya punya masalah yang sama dengan mencari dan mengganti tetapi git reset memberitahu saya ada dua file paket di .git / objek / pack / yang tidak dapat diakses. Anda punya ide?
epsilones

13
bukankah lebih aman untuk digunakan git reset --keepsaja? Di Tower Git Cheat Sheet dijelaskan sebagai: Setel ulang pointer HEAD Anda ke komit sebelumnya dan pertahankan perubahan lokal yang tidak dikomit
Pjetr

10
Tidak ada ketika saya menulis jawaban ini ... Bagaimanapun git reset --keepbentuknya lebih aman git reset --hard; git reset --mixedtidak menyentuh workdir sama sekali.
Jakub Narębski

76

Anda mungkin telah secara tidak sengaja merusak file .git / index dengan sed pada root proyek Anda (mungkin refactoring?) Dengan sesuatu seperti:

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

untuk menghindari ini di masa depan, abaikan saja file biner dengan grep / sed Anda:

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

6
Jika Anda tidak keberatan kehilangan perubahan .git/index, Anda selalu dapat menghapusnya dan membuat ulang dengan git reset(tanpa --hard!).
Jakub Narębski

1
Saya memecahkannya dengan # find ./ -type f -exec sed -i 's / Politisi / Legislator / g' {} \; Melakukan apa yang direkomendasikan oleh jawaban ini tidak akan merusaknya sejak awal, tetapi jawaban yang diterima memperbaiki kerusakan yang saya lakukan. Ini adalah pencegahan yang luar biasa.
Ryan Mortensen

1
@RyanMortensen Anda dapat mencoba membalikkan Anda seddengan sesuatu seperti find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Ini mungkin membantu jika Anda .git/begitu rusak sehingga git resettidak akan berfungsi. Atau mungkin Anda ingin mengembalikan yang sudah ada .git/indextanpa menghapusnya. Ini akan gagal, tentu saja, jika kode atau indeks asli Anda sudah memiliki "Legislator" di dalamnya.
Hobs

1
Terima kasih @hob, Anda telah menyelamatkan saya dari banyak masalah - saya menyelesaikannya dengan membalikkannya seddengan mengganti saya new_stringdengan milik saya old_string!
tsveti_iko

1
Saya refactored seluruh proyek saya alih-alih folder 'src' di IntelliJ dan mengalami masalah ini. Ini menjelaskan mengapa saya memiliki kesalahan aneh seperti itu!
Michael

18

Saya punya masalah itu, dan saya mencoba memperbaikinya dengan ini:

rm -f .git/index
git reset

TAPI itu tidak berhasil. Solusinya ? Untuk beberapa alasan saya punya folder .git lain di sub direktori. Saya menghapus folder .git itu (bukan yang utama) dan git resetlagi. Setelah dihapus, semuanya bekerja kembali.


15

Ini terdengar seperti klon yang buruk. Anda dapat mencoba yang berikut ini untuk mendapatkan (mungkin?) Informasi lebih lanjut:

git fsck --full

8

Karena solusi di atas membuat saya terus mengalami masalah, saya menggunakan solusi yang membosankan ini:

  1. mengkloning salinan repo baru di tempat lain
  2. salin direktori .git yang baru ke dalam repo (rusak) yang berisi perubahan yang ingin saya komit

Lakukan triknya. Btw, saya melakukan sedroot proyek seperti dugaan @hobs. Belajar pelajaran saya.


Itu brilian :)
Jeremy Belolo

Ini tidak benar-benar brilian jika Anda berada di tengah-tengah penggabungan, telah membuat cabang atau telah mengeluarkan komitmen sejak kloning, atau salah satu dari sejumlah skenario lain ... Mengkloning salinan baru dari repo bukanlah solusi dan saya berani mengatakan itu menampar ketidaksabaran (paling baik ditinggalkan saat dalam keadaan darurat). Jauh lebih baik untuk benar-benar mendiagnosis apa yang sedang terjadi dan memperbaiki indeks repo yang ada - itu biasanya relatif mudah dilakukan. Kadang-kadang Anda bisa mengganti nama file indeks (atau menghapusnya, jika Anda yakin tidak akan membutuhkannya lagi) dan biarkan Git membuat yang baru (menggunakan git-reset atau git-checkout) ..
Jazimov

7

Ini berhasil untuk saya. Meskipun saya ingin tahu alasan saya mulai mendapatkan kesalahan di tempat pertama. Ketika saya keluar kemarin, itu baik-baik saja. Masuk pagi ini, ternyata tidak.

rm .git/index

git reset

Ini bekerja untuk saya, Meskipun menghapus semua file yang ditambahkan dari git. Saya harus menjalankan git add untuk file-file itu
Shamsul Arefin Sajib

6

Catatan untuk pengguna git submodule - solusi di sini tidak akan bekerja untuk Anda apa adanya.

Katakanlah Anda memiliki repositori induk yang dipanggil dev, misalnya, dan repositori submodule Anda dipanggil api.

jika Anda berada di dalam apidan Anda mendapatkan kesalahan yang disebutkan dalam pertanyaan ini:

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

The indexFile tidak akan berada di dalam sebuah .gitfolder. Bahkan, .gitbahkan tidak akan menjadi folder - itu akan menjadi dokumen teks dengan lokasi data .git nyata untuk repositori ini. Kemungkinan seperti ini:

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

Jadi, alih-alih rm -f .git/index, Anda perlu melakukan ini:

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

atau, lebih umum,

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


4

Masalah ini dapat terjadi ketika ada .gitdirektori di bawah salah satu subdirektori. Untuk memperbaikinya, periksa apakah ada direktori .git lain di sana, dan hapus dan coba lagi.


Beberapa jawaban lain telah memberikan informasi ini.
Simon Forsberg

-1

Saya melakukan trik sederhana. Saya mengkloning repo ke folder baru. Menyalin folder .git dari folder baru ke folder lama repo, menggantikan .git di sana.


Sangat berbahaya karena akan menghapus data seperti komit yang tidak diterbitkan, tag, dan cabang, serta stash dan reflog.
Koraktor

Tidak yakin tentang komit yang tidak diterbitkan karena saya yakin mereka disimpan dalam folder .git dan saya menyalin folder .git. Saya tidak kehilangan apapun dengan metode ini. Saya tidak tahu tentang simpanan dan reflog untuk membuat komentar tentang itu.
Astra Uvarova - Bintang Saturnus

Anda benar, tetapi mungkin Anda harus menekankan bahwa Anda melakukan kloning lokal. Tetapi komentar saya masih benar untuk simpanan dan reflog.
Koraktor

Oke, saya tidak punya pengalaman tentang komentar itu lebih jauh, namun, itu berhasil untuk saya dan beberapa pengguna mungkin merasa berguna. Tidak perlu downvote.
Astra Uvarova - Bintang Saturnus


-7

Ini konyol tapi saya baru saja me-reboot mesin saya (mac) dan masalahnya hilang seperti itu belum pernah terjadi. Aku benci terdengar seperti pria pendukung ...


-9

Anda juga dapat mencoba mengembalikan ke versi file sebelumnya (jika Anda menggunakan os windows)


1
Jangan berikan jawaban yang Anda tidak tahu.
Altaf Patel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.