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?

Nomor 8
sumber
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.

Jakub Narębski
sumber
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")
hobs
sumber
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.

Cleiton Almeida
sumber
15

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

git fsck --full
Gav
sumber
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.

eskimwier
sumber
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
Delapan puluh
sumber
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

Jenming
sumber
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.

Nick Kuijpers
sumber
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.

Astra Uvarova - Bintang Saturnus
sumber
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 ...

Herman Leus
sumber
-9

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

Shyamsundar
sumber
1
Jangan berikan jawaban yang Anda tidak tahu.
Altaf Patel