Git使用時の「エラー:不正なインデックス–致命的:インデックスファイルが破損しています」の解決方法


611

git init、いくつかのファイルを追加してコミットし、いくつかの変更を加えて、追加してコミットしました。gitデーモン(WinXPのCygwinで実行)をセットアップし、リポジトリのクローンを1回作成します。今、私はクローンされたリポジトリでこのエラーを受け取ります:

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

リポジトリの新しいコピーを取得する以外に、これを修正する方法はありますか?


これはクローンされたリポジトリにありますか、それとも元のリポジトリにありますか?cloneコマンドはエラーを出力しましたか?
CBベイリー

回答:


1257

問題がコミットのステージング領域としてのインデックスにある場合(つまり、.git/index)、インデックスを削除し(必要に応じてバックアップコピーを作成)、最後のコミットのバージョンにインデックスを復元します。

OSX / Linuxの場合:

rm -f .git/index
git reset

Windowsの場合:

del .git\index
git reset

(上記のresetコマンドはと同じです git reset --mixed HEAD

代わりに、より低いレベルの配管を 使用できます。git read-treegit reset


問題がpackfileのインデックスにある場合は、を使用して回復できますgit index-pack


27
私は誤っ:w!:Gstatus(fugitive.vimから)を実行しました。この答えは私に多くの髪を引っ張って救った。
ローレンスゴンサルベス

5
私も「私も」のメッセージは好きではありませんが、「私も」のメッセージは好きです。Windowsで同等のものはerase /s .git\index、私も必要でしたerase .git\index.lock
ジェレミー・マギー

1
こんにちは、検索と置換で同じ問題がありましたが、git resetを使用すると、アクセスできない.git / objects / pack /に2つのパックファイルがあることがわかります。アイデアはありますか?
エプシロン2013年

13
git reset --keep代わりに使用する方が安全ではないでしょうか?でタワーのGitチートシートには、のように説明されていますコミットされていないローカルな変更をコミット以前に、あなたのHEADポインタをリセットし、保存する
Pjetr

10
私がこの回答を書いているときは存在しませんでした...とにかくgit reset --keep安全な形式ですgit reset --hardgit reset --mixedworkdirにはまったく触れません。
JakubNarębski2013年

76

プロジェクトルートのsgitで.git / indexファイルを誤って破損した可能性があります(おそらくリファクタリングですか?)

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

今後これを回避するには、grep / sedでバイナリファイルを無視してください:

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

6
で変更を失ってもかまわない場合は.git/index、いつでも削除して、git reset--hard!なしで)再作成できます。
JakubNarębski、2012年

1
#find ./ -type f -exec sed -i 's / Politician / Legislator / g' {} \; この回答が推奨することを実行しても、そもそもそれは壊れていなかったでしょうが、受け入れられた回答は、私が行った損傷を修復しました。これは優れた予防策ですが。
Ryan Mortensen 2015年

1
@RyanMortensenあなたは これが壊れているのでうまく動かない場合、これのsedようなものであなたの反転を試すことができます。または、既存のものを削除せずに復元したい場合もあります。もちろん、元のコードまたはインデックスにすでに「Legislator」が含まれている場合、これは失敗します。find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \;.git/git reset.git/index
2018

1
私は反転し、それを解決-あなたは私に多くのトラブルを保存@hobsありがとうsed私を置き換えることによって、new_string私にold_string
tsveti_iko 2018

1
IntelliJの「src」フォルダーの代わりにプロジェクト全体をリファクタリングし、この問題が発生しました。これはなぜ私がそのような奇妙なエラーを起こしたかを説明しています!
マイケル

18

私はその問題を抱えていたので、これを修正しようとしました:

rm -f .git/index
git reset

しかし、それはうまくいきませんでした。解決策は?何らかの理由で、サブディレクトリに他の.gitフォルダーがありました。これらの.gitフォルダー(プリンシパルではない)をgit resetもう一度削除します。それらが削除されると、すべてが再び機能しました。


15

これは悪いクローンのように聞こえます。次のことを試して、(おそらく?)詳細情報を取得できます。

git fsck --full

8

上記の解決策では引き続き問題が発生するため、次の鈍い解決策を使用しました。

  1. 別の場所にレポの新しいコピーを複製する
  2. 新しい.gitディレクトリを、コミットしたい変更が含まれている(壊れた)リポジトリにコピーします。

トリックをしました。ところで、sed@ hobsが推測したとおり、私はプロジェクトルートでaを実行しました。私のレッスンを学びました。


それは素晴らしいです:)
Jeremy Belolo

マージの途中、ブランチを作成したり、クローン作成以降にコミットを発行したり、他のいくつかのシナリオを実行したりしても、それほど素晴らしいことではありません...リポジトリの新しいコピーをクローンすることはほとんど解決策ではありません。それは、焦りの音を立てます(本当のピンチのときに残しておくのが最善です)。実際に何が起こっているのかを診断し、既存のリポジトリのインデックスを修復する方がはるかに優れています。これは通常、比較的簡単に実行できます。時には、あなただけのインデックスファイルの名前を変更(または削除するには、それを、あなたはあなたが二度とそれを必要としないなら)と..(gitのリセットまたはgitのチェックアウトを使用して)Gitが新しいものを作成させることができます
Jazimov

7

これでうまくいきました。そもそもエラーが出始めた理由が気になりますが。昨日ログアウトした時は大丈夫でした。今朝ログインしてください、そうではありませんでした。

rm .git/index

git reset

これは私にとってはうまくいきましたが、追加されたファイルはすべてgitから削除されました。これらのファイルに対してgit addを実行する必要がありました
Shamsul Arefin Sajib '21 / 10/21

6

gitサブモジュールユーザーへの注意-ここでのソリューションは、そのままでは機能しません。

devたとえば、という親リポジトリがあり、サブモジュールリポジトリがという名前であるとしapiます。

あなたが中にいapiて、この質問で言及されたエラーを受け取った場合:

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

indexファイルは内部のことはありません.gitフォルダ。実際、これ.gitはフォルダでもなく、このリポジトリの実際の.gitデータの場所が記載されたテキストドキュメントになります。おそらくこのようなもの:

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

したがって、の代わりにrm -f .git/index、次のようにする必要があります。

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

または、より一般的には、

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


4

この問題.gitは、サブディレクトリの1つの下にディレクトリがある場合に発生する可能性があります。修正するには、そこに他の.gitディレクトリがあるかどうかを確認し、それらを削除して再試行します。


他のいくつかの回答はすでにこの情報を提供しています。
Simon Forsberg、

-1

私は簡単なトリックをしました。リポジトリを新しいフォルダに複製します。.gitフォルダーを新しいフォルダーからレポの古いフォルダーにコピーし、そこの.gitを置き換えました。


未公開のコミット、タグ、ブランチ、スタッシュ、reflogなどのデータが削除されるため、非常に危険です。
コラクトール

非公開のコミットは.gitフォルダーに保存されていると思います。私は.gitフォルダーをコピーしました。この方法で何も失うことはありませんでした。私はそれについてコメントするための隠し場所とreflogについて知りません。
アストラウヴァロワ-土星の星

あなたは正しいですが、おそらくローカルクローンを作成したことを強調する必要があります。しかし、私のコメントはstashとreflogにはまだ当てはまりません。
コラクトール

わかりました。そのコメントについてこれ以上何も経験していませんが、私にとってはうまくいき、一部のユーザーはそれが役立つと思うかもしれません。反対投票する必要はありません。
アストラウヴァロワ-土星の星


-7

これはばかげていますが、マシン(mac)を再起動しただけで、問題は一度も起こらなかったようになくなりました。私はサポート担当者のように聞こえるのが嫌いです...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.