2011-11-25 150 views
32

パワーサプライの問題のためにいくつかのハードリブート後にgitリポジトリが壊れてしまいましたが、修正できませんでした(最後の電源障害時にファイルをステージングしていました)壊れたgitリポジトリを修復する

$ git status                               
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git fsck 
fatal: failed to read object 24377c609184c192f3f3c1733bac7115c1080758: Invalid argument 
$ git branch -a 
(...works, lists branches...) 
$ git checkout someotherbranch 
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log            
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log someotherbranch 
(...works, shows commits...) 

私の現在のブランチはかなり台無しになっており、私はそれを修正できないようです。私はこれを修復しようとすることができますか?

+1

はこのサーバーですか?復元に使用できるローカルクローン/リポジトリが存在しますか? – prusswan

+1

これは私のローカルgit repoです...私はすべて(おそらく失われたいくつかのコミットで)を復元するために使用できる別のマシン上のクローンを持っていますが、私はむしろ可能であればこのレポを修正したいと思います... – Unknown

+0

それは言及する価値があります作業フォルダの内容がまだ回復可能である可能性があります。 'git diff> diff.patch'を実行すると、次のように新しいクローンにパッチを当てることができます:' git patch -p1 datashaman

答えて

5

リポジトリのバックアップを作成し、git reset --hard [email protected]{1}を実行して前のHEADに戻り、これが機能するかどうかを確認してください。現在のHEADが破損している可能性があります。

(お持ちでない場合は、あなたのディスク上fsckを実行する必要があります。)似たような状況のため

+1

$ git reset --hard HEAD @ {1} ファイルのチェックアウト:100%(5724/5724)完了。 致命的:オブジェクトの読み取りに失敗しました3d18855708b0f127d40c13c679559d7679228b69:無効な引数 – Unknown

+0

ダーン。 'git reflog'は機能しますか? –

+1

致命的ないや、同じこと:($のGitのREFLOG :オブジェクト3d18855708b0f127d40c13c679559d7679228b69の読み取りに失敗しました:無効な引数 – Unknown

31

私のソリューションは、コミット前ののハッシュと.git/refs/heads/my-working-branchに損傷を受けたオブジェクトのハッシュを交換しました( .git/logs/HEADにあります)。

+1

リポジトリは依然として壊れた状態になりますが、これにより回復できます。 – ony

+5

私はこれが何であるか分かりません –

+0

うわー。これはうまくいきました...私の 'HEAD'は'^@^@^@^@ ... 'やそのようなものに堕落していました。 –

9

私にとって、私は、Apple以外のSSD(これは推奨されない)を使ってOSXでTRIMを有効にし、私のブートディスクに明らかに様々な破損を引き起こしました。だから腐敗したコミットは歴史の深いところだった。

リモートリポジトリに移動するにはあまりにも実験的ないくつかのローカルブランチを持っていることを除いて、私のレポを修復することはあまり気にしません。そのブランチで作業を救済したいと思います。

理論上、これはローカルリポジトリであるため、gitは元を使って回復/修復できるはずです。これはなぜできないのですか?私は残念ながらthis cool strategy to push a branch to another local git repo.を偶然見つけいずれにしても

../repo_copyにレポをクローニングして、ローカル、リモート、次のエラーが生じたとしてその使用:

! git push --force local_remote HEAD 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 
error: failed to push some refs to '/Users/steve/Dev/repo_copy' 

だから私は、その後押し、空のレポを代わりに開始それへのブランチは正常に機能しました。だから、そのgit logでは終わらなかった私が持っていたすべてのローカルブランチのために:

.... 
    Fixing cukes 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 

私は単にそれをチェックアウトしてからgit push --force local_remote HEADを行うだろう。私は最後ました:

! cd ~/Dev/repo_copy 
! git remote add origin [email protected]:sdhull/my_repo.git # real remote 

は、その後、私はgit config -eに行き、セットアップ私のmasterブランチをバックアップし、失われた何も実行していました!あなたがこのアプローチについての詳細を知りたいのであれば、コメントで私に教えてください。乾杯!

14

これはちょうど私に起こった。リポジトリを新しいフォルダに再クローンし、最新の変更を手動で移動します。 Low techですが、毎回動作します。うまくいけば、あなたは最後の変更を覚えているでしょう。

+4

壊れたリポジトリの '.git'フォルダを再クローンしたフォルダに置き換えることができます。そうすれば、手動で変更を移動する必要はありません。分枝に気をつけてください。あなたは隠れて、正しいブランチをチェックアウトしなければならないかもしれません。 –

3

私はから私のレポを回復することができました:壊れたからmasterをフェッチし、

zsh(broken)% echo da9c14d03e4849394087b61ff6272399937f7cce > .git/refs/heads/master 
zsh(broken)% git log --oneline -1 master 
da9c14d plan: timings 
zsh(broken)% git fsck 
Checking object directories: 100% (256/256), done. 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
fatal: loose object 0eace931fdc851da254e9522596d1517d0ed51c5 (stored in .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5) is corrupt 

は、新しい空のレポを作成する:@Nash橋が語るようda9c14d03e4849394087b61ff6272399937f7cceをコミットする前するmasterをリセットすることで

zsh(broken)% git log master 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
fatal: loose object 7fcab8648a989d9bb3f5246e6be7220395493395 (stored in .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395) is corrupt 
zsh(broken)% cat .git/refs/heads/master 
7fcab8648a989d9bb3f5246e6be7220395493395 
e311726c4eb970f4d4f504ad86248d322855018f da9c14d03e4849394087b61ff6272399937f7cce Nikolay Orliuk <[email protected]> 1379583764 +0300 commit: plan: timings 

zsh(broken)% mkdir ../recover && cd ../recover && git init 
Initialized empty Git repository in /home/nikolay/talks/y/recover/.git/ 
zsh(recover)% git fetch ../broken master 
remote: Counting objects: 44, done. 
remote: Compressing objects: 100% (44/44), done. 
remote: Total 44 (delta 20), reused 0 (delta 0) 
Unpacking objects: 100% (44/44), done. 
From ../broken 
* branch   master  -> FETCH_HEAD 
zsh(recover)% git reset --hard FETCH_HEAD 
HEAD is now at da9c14d plan: timings 
zsh% git fsck 
Checking object directories: 100% (256/256), done. 

thosを復元するにはmasterへの道にあった電子の変更:あなたがでクローンをgitの可能性:

zsh(recover)% rm -rf * && cp -a ../broken/* ./   
zsh(recover)% git add -u && git commit -m 'prepare for publishing' 
1

私は指示に従ったがhere

$ cd /tmp/ 
$ git clone good-host:/path/to/good-repo 
$ cd /home/user/broken-repo 
$ echo /tmp/good-repo/.git/objects/ > .git/objects/info/alternates 
$ git repack -a -d 
$ rm -rf /tmp/good-repo 

は私

1

のために私のための最も簡単な解決策を働きました新しいフォルダを作成して、クリーンなnew_folder/.gitを古いフォルダ(破損したフォルダ)に置き換えます。それは私のためにうまくいく!

git clone ...(remote) new_folder 
mv old_folder/.git old_folder/.git_old 
cp -R new_folder/.git old_folder/ 

乾杯!私のために働いた

1

別の方法として使用して以前の状態にgitのヘッドとインデックスをリセットすることでした:

git reset --keep

私はまた、次のコマンドを試してみましたが、彼らは私のために動作しませんでしたが、彼らは可能性がありますあなたのため:

git reset --mixed git fsck --full git gc --auto git prune --expire now git reflog --all

関連する問題