備忘録的に。
間違ったshellを動かしてgitレポジトリをぶっ壊してしまったとき。(.git ファイルなど隠しファイルにも影響を与えてしまった場合。。)
$ git checkout .
を行なっても下記エラー。
fatal: Unknown index entry format x56axxxx
ほなとりあえずローカルレポジトリのremoteとの紐付け消すか、としたら
$ git remote rm origin
error: non-monotonic index .git/objects/pack/pack-12kjneffselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjnadwselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjnefffslfnwj3jwwk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneawselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffselfnwj35wjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffssdfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffawdfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
うおお。なにこれ。
$ git fsck --full
error: inflate: data stream error (invalid distance too far back)
error: unable to unpack header of .git/objects/04/4c9cedaw427385a0aae914bea384fc45ba03236
したら同じようなログが1000行以上でてきた。これはもうちょっと解析できるレベルではない。
新しく同じ名前のディレクトリをつくって git remote add
してから git pull
しても下記。
$ git pull origin master
error: refs/heads/master does not point to a valid object!
error: inflate: data stream error (invalid block type)
error: unable to unpack xxxdc4ae26830ab44ae2746c52865556a4d993c1 header
error: inflate: data stream error (invalid block type)
error: unable to unpack xxxdc4ae26830ab44ae2746c52865556a4d993c1 header
fatal: loose object xxxdc4ae26830ab44ae2746c52865556a4d993c1 (stored in .git/objects/xx/xxx4ae26830ab44ae2746c52865556a4d993c1) is corrupt
おそらくだが .git
までshellで変更してしまったから、もうこれは直せないと感じ、
下記を試しました。現状のリモートディレクトリの .git
を持ってきて自分のローカルのものと置き換える。
The fix
Execute these commands from the parent directory above your repo (replace 'foo' with the name of your project folder):
Create a backup of the corrupt directory:
cp -R foo foo-backup
Make a new clone of the remote repository to a new directory:
git clone git@www.mydomain.de:foo foo-newclone
Delete the corrupt .git subdirectory:
rm -rf foo/.git
Move the newly cloned .git subdirectory into foo:
mv foo-newclone/.git foo
Delete the rest of the temporary new clone:
rm -rf foo-newclone
これで元に戻りました。
ありがとうStackOverflow.
今回、ローカルだったのでぶっ壊れてもなんとかなりましたが、これをリモート側でやってしまったら結構取り返しのつかない大事件になるところでした。
リモート先で実験する場合はmasterレポジトリをbackupした先で行うことが必要だと再実感できてよかったです。