2013-01-01 15 views
7

リポジトリに破損オブジェクトがある状況があります。リポジトリからgit破損ブロブを削除してください

$ git push 
... 
fatal: loose object 95b6a826cadae849f4932a71d6735ab6ceb47cab (stored in .git/objects/95/b6a826cadae849f4932a71d6735ab6ceb47cab) is corrupt 
... 

そして私は、このオブジェは、古いによってリンクブロブコミットされていることを知っている:

$ git fsck --full 
Checking object directories: 100% (256/256), done. 
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf 
      to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab 

私はclassic steps to recover the blob from the FAQを行っているが、それの他のコピーは、私が見つけることができる場所であればどこでもありませんようです(私は一人で働いていて、しばらくリモコンに押し込んでいないので、そこにはいません)ので、私はそれを回復できません。

このブロブは実際にはそれ以来多く変更されているファイルの最初のバージョンです。私はそのファイルのバージョンに関する情報を失っています。だから私はそれを指しているコミットからそれを削除したいと思います。どうやってやるの?

+0

解決策のいくつかをここで見てみてください:http://stackoverflow.com/q/4254389/1031900 –

+0

この質問は、少し違う破損したツリーについてです。これらの答えのどれも、悲しいことに私を助けることはできません。私はいくつかのことを試してみることにして、仕事をすればここに投稿します。 –

答えて

4

私は最終的に自分自身を考え出しました。

ショートバージョン:履歴から削除するために、破損したBLOBを指しているコミットを修正しました。

ロングバージョン:ファイルが何であるか分かっていて、コミットから消えるようにしたいと思ったので、古いコミットを修正することができたと思いました。私はそれが本当にうまくいくとは思っていませんでしたが、やっとそれは終わりました

私は以前のことを試す際に.git/objects内のブロブを削除したことを指摘しなければならない。

まず、私はそれが何であるかを知る必要がありました。そのために私は私がコミットが966a46命名されました見つかったコマンド

git log --raw --all --full-history -- subdir/my-file 

を使用....

その後、私はそれを修正するための手順を行いました。それがコミット歳だったので、私は私の編集者がコミットごとに1行で来て、私は私が変更したいコミットの前にある「編集」に「ピック」に変更。

git rebase -- interactive 966a46^ 

を使用しました

コマンドgit statusは私が消去したいファイルが変更されたことを私に示した:

# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: subdir/my-file 

私はコミットからそれを削除したかったので、私はrm subdir/my-fileをしました。 git statusが表示されました:

#  deleted: subdir/my-file 

これは有望でした。

git commit --all --amend 
git rebase --continue 

しかし、それは、このエラーで失敗しましたいくつかのコミットリベースした後:

error: could not apply 45c2315... did some fancy things 
fatal: unable to read 95b6a826cadae849f4932a71d6735ab6ceb47cab 

45c2315を私のファイルが変更された最初のコミットされたので、私は単純にコミット改正やリベースを継続的にコミット作成された後。以前のバージョンのファイルが見つからなかったので、ただ失敗しました。

git statusは、とりわけ、私を示した:

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
#  deleted by us:  subdir/my-file 

を私は実際にそれが何を意味するのかわからないんだけど、このコミットは、ファイルを修正した後、表示されることになるで最初になるはずでした。だから私はそれが削除されることを望んでいないが、反対に、コミットに追加!だから私は

git add subdir/my-file 

を行なったし、確かにgit statusは、「新規ファイル」としてそれを示しました。

その後、私はgit rebase --continueを実行し、すべてがうまくいって、リベースが成功しました。

git pushは、壊れたブロブについて失敗する代わりにスムーズに進みました。

しかしgit fsckはまだ失敗していたため、問題が、まだそこにあった。私はすべてを剪定するように頼んだとき

$ git fsck --full 
Checking object directories: 100% (256/256), done. 
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf 
       to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab 

そしてgit gcは、あまりにも失敗しました。だから私は、私が以前に成功裏にプッシュしたので、新しいリポジトリにすべてを戻してそこから作業するという、最善の行動をとっていることを理解しました。

関連する問題