Git kullanırken “Hata: hatalı dizin - Önemli: dizin dosyası bozuk” nasıl giderilir


611

Sonra git initbirkaç dosya ekledim ve taahhüt ettim, bazı değişiklikler yaptım, ekledim ve taahhüt ettim. Git artalan sürecini kurun (WinXP'de Cygwin altında çalışıyor) ve havuzu bir kez klonladı. Şimdi, klonlanmış depo ile bu hatayı alıyorum:

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

Bunu düzeltmenin, deponun yeni bir kopyasını almak dışında bir yolu var mı?


Bu klonlanmış depoda mı yoksa orijinal depoda mı? Klon komutu herhangi bir hata çıktı mı?
CB Bailey

Yanıtlar:


1256

Sorun, dizinler için hazırlama alanı olarak .git/indexdizinle ilgiliyse (örn. ), Dizini kaldırabilir (isterseniz yedek bir kopya oluşturabilirsiniz) ve ardından son işlemde dizini sürüme geri yükleyebilirsiniz:

OSX / Linux'ta:

rm -f .git/index
git reset

Windows'ta:

del .git\index
git reset

(Yukarıdaki resetkomut aynıdır git reset --mixed HEAD)

Sen alternatif olarak alt düzey kullanabilirsiniz tesisat git read-tree yerine git reset.


Sorunun nedeni ise endekste packfile , kullanmakta kurtarabilirsiniz git index-pack.


27
Yanlışlıkla :w!bir :Gstatus(fugitive.vim den) yaptım . Bu cevap bana çok fazla saç çekmemi sağladı.
Laurence Gonsalves

5
"Ben de" mesajlarını sevmediğimizi biliyorum - ama "ben de". Windows'ta eşdeğer erase /s .git\index, benim de ihtiyacım erase .git\index.lockvardı.
Jeremy McGee

1
Merhaba, bul ve değiştir ile aynı sorunu vardı ama git reset bana .git / objects / pack / içinde erişilemeyen iki paket dosyaları olduğunu söylüyor. Bir fikrin var mı?
epsilones

13
onun git reset --keepyerine kullanmak daha güvenli olmaz mıydı ? In Kule Git Cheat Sheet o kadar açıklanmıştır: kaydedilmemiş yerel değişiklikler taahhüt önceki üzere BAŞ işaretçisi sıfırlayın ve korumak
Pjetr

10
Bu cevabı yazarken yoktu ... Her neyse git reset --keepdaha güvenli bir biçim git reset --hard; git reset --mixediş dizinine hiç dokunmaz.
Jakub Narębski

76

Yanlışlıkla .git / index dosyasını proje kökünüzde bir sed ile (belki yeniden düzenleme?) Aşağıdaki gibi bir şeyle bozmuş olabilirsiniz:

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

gelecekte bundan kaçınmak için, grep / sed ile ikili dosyaları görmezden gelmeniz yeterlidir:

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

6
Değişiklikleri kaybetmenin sakıncası .git/indexyoksa, her zaman silebilir ve git reset(olmadan --hard!) Yeniden oluşturabilirsiniz .
Jakub Narębski

1
# Find ./ -type f -exec sed -i 's / Politikacı / Mevzuat / g' {} \; Bu cevabın tavsiye ettiği şeyi yapmak ilk etapta onu kırmazdı, ancak kabul edilen cevap yaptığım hasarı onardı. Bu mükemmel bir önlemdir.
Ryan Mortensen

1
@RyanMortensen Eğer sizin sedgibi bir şey ile ters deneyebilirsiniz find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Bu işe yaramazsa .git/o kadar bozuk ise yardımcı olabilir git reset. Veya mevcut .git/indexolanınızı silmeden geri yüklemek isteyebilirsiniz . Tabii ki, orijinal kodunuz veya dizininizde zaten bir "Mevzuatçı" varsa, bu başarısız olur.
ocaklar

1
Teşekkürler @hobs bana çok fazla sorun kurtardın - sedbenim new_stringile değiştirerek ters çözdü benim old_string!
tsveti_iko

1
IntelliJ'deki 'src' klasörü yerine tüm projemi yeniden düzenledim ve bu sorunu yaşadım. Bu neden bu kadar garip hatalar yaşadığımı açıklıyor!
Michael

18

Ben bu sorunu vardı, ve ben bu ile ti düzeltme deneyin:

rm -f .git/index
git reset

Ama çalışmadı. Çözüm ? Nedense alt dizinlerde başka .git klasörleri vardı. Bu .git klasörlerini (asıl değil) silerim ve git resettekrar. Silindikten sonra her şey tekrar çalıştı.


15

Bu kötü bir klon gibi geliyor. Daha fazla bilgi almak için (muhtemelen?) Aşağıdakileri deneyebilirsiniz:

git fsck --full

8

Yukarıdaki çözümler beni sürekli problemlerle terk ettiğinden, bu donuk çözümü kullandım:

  1. başka bir yerde repo'nun yeni bir kopyasını klonla
  2. fresh .git dizinini işlemek istediğim değişiklikleri içeren (bozuk) repoya kopyala

Hile yaptı. Btw, sed@hobs'un tahmin ettiği gibi proje kökünde bir yaptım . Dersimi öğrendim.


Bu mükemmel :)
Jeremy Belolo

Bir birleştirme işleminin ortasında olsaydınız, klonlamadan bu yana şubeler oluşturduysanız veya herhangi bir taahhüt verdiyseniz gerçekten parlak değil ... veya başka senaryolardan herhangi biri ... Reponun yeni bir kopyasını kopyalamak neredeyse bir çözüm değil sabırsızlık (gerçek bir tutam zaman en iyi sol) smacks. Neler olup bittiğini gerçekten teşhis etmek ve mevcut repo endeksini onarmak daha iyidir - bu genellikle nispeten kolaydır. Bazen sadece indeks dosyasını yeniden adlandırabilir (veya bir daha hiç ihtiyacınız olmayacağından eminseniz silebilirsiniz) ve
Git'in

7

Bu benim için çalıştı. Her ne kadar hataları ilk başta almaya başladığımı merak etsem de. Dün çıkış yaptığımda iyiydi. Bu sabah giriş yap, öyle değildi.

rm .git/index

git reset

Gitti tüm eklenen dosyaları kaldırılmış olmasına rağmen, bu benim için çalıştı. Ben bu dosyalar için git add çalıştırmak zorunda
Shamsul Arefin Sajib

6

Git submodule kullanıcıları için not - buradaki çözümler sizin için olduğu gibi çalışmaz.

Diyelim ki dev, örneğin üst modül deponuz var ve alt modül deponuzapi .

içindeyseniz apive bu soruda belirtilen hatayı alırsanız:

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

indexDosya bir iç olmayacaktır .gitklasöründe. Aslında, .gitbir klasör bile olmayacak - bu depo için gerçek .git verilerinin bulunduğu bir metin belgesi olacaktır. Muhtemelen böyle bir şey:

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

Yani, bunun yerine rm -f .git/indexbunu yapmanız gerekecek:

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

veya daha genel olarak,

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


4

Bu sorun .git, alt dizinlerden birinin altında bir dizin olduğunda oluşabilir . Düzeltmek için, orada başka .git dizinleri olup olmadığını kontrol edin ve kaldırın ve tekrar deneyin.


Diğer birkaç cevap bu bilgiyi zaten sağlamıştır.
Simon Forsberg

-1

Basit bir numara yaptım. Repoyu yeni bir klasöre kopyaladım. .Git klasörünü yeni klasörden repo'nun eski klasörüne kopyalayıp .git yerine kopyalayın.


Çok tehlikeli çünkü yayınlanmamış taahhütler, etiketler ve dallar, ayrıca yığınlar ve reflog verileri siler.
Koraktor

Yayımlanmamış taahhütlerden emin değilim .git klasöründe saklandıklarına ve .git klasörüne kopyalandığına inanıyorum. Bu yöntemle hiçbir şey kaybetmedim. Bu konuda herhangi bir yorum yapmak için saklamak ve reflog hakkında bilmiyorum.
Astra Uvarova - Satürn'ün yıldızı

Haklısın, ama belki de yerel bir klon yaptığını vurgulamalısın. Ama benim yorumum saklamak ve saklamak için hala geçerli.
Koraktor

Tamam, bu yorum hakkında başka bir deneyimim yok, ancak benim için çalıştı ve bazı kullanıcılar bunu yararlı bulabilir. Onu küçümsemeye gerek yok.
Astra Uvarova - Satürn'ün yıldızı


-7

Bu çok saçma ama makinemi (mac) yeniden başlattım ve sorun hiç olmamış gibi gitti. Destek adamı gibi konuşmaktan nefret ediyorum ...


-9

Ayrıca dosyanın önceki sürümüne geri yüklemeyi de deneyebilirsiniz (Windows işletim sistemi kullanıyorsanız)


1
Bilmediğiniz bir cevap vermeyin.
Altaf Patel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.