2016-12-04 11 views
4

私はgitリポジトリに何かをコミットするたびに、私はもはや存在しないいくつかのファイルを言及する(明らかに無害な)エラーメッセージを取得しています:gitのエラーメッセージをコミットします。(以前に削除されたソースファイル)を開くことができません

$ git commit -a 
error: Could not open cssrc/csgrpc/Main.cs 
error: Could not open cssrc/csgrpc/Main.cs 
Recorded preimage for 'cssrc/csgrpc/Main.cs' 
... more 3-line groups like one above ... 
[x017-upgrade a86861b] Point Audio to new location of.... 
1 file changed, 1 insertion(+), 1 deletion(-) 

ファイルは当初で維持されたサブツリーの一部でしたが、このプロジェクトではこれ以上必要ではない(したがって以前に変更されてコミットされたため競合していた)ので、git subtree pullの間に削除されました。

ファイルが実際にインデックスにもworktreeにも見られない:

$ git ls-files -cs | grep Main.cs 
$ find -name 'Main.cs' 
$ 

rerere.enabledオプションがtrueに設定されています。それは犯人ですか?これらのファイル名へのポインタがどこに格納されていますか?それをきれいにする方法?

+0

rerereレコードは '.git/MERGE_RR'です。ただし、そのファイルは、マージを中断または完了したときにクリーンアップされている必要があります。 – torek

+0

@torek:ファイルには、 'git rerere clean'によってのみ削除された3つのレコードが含まれていました。下の回答を確認してください(最近大きく拡大されています)。私は現在、ステップ41で混乱しています。 :) – kkm

答えて

3

エラーの原因は、gitのrerereまたは「記録された解像度の再利用」です。あなたが「git subtree pull conflictの間にあなたのファイルを削除したので」、あなたは誤ってgitを「解決されていない」状態にしています。 git rerereは、後で行を再利用するために、きれいな競合解消レコードを維持することを最善に試みます。競合解消の途中でファイルを削除したため、rerereにこれらのファイルへの参照があり、もはや存在しないファイルを探します。 gitが記録された解像度を再利用するためには、関連するステップを記録しなければならないことを理解してください。しかし、これはgitがあなたが使っているコマンドを追跡しているわけではありません。これは、競合状態にあるファイルが解決された状態からなぜ失われているのかわからない理由を説明しています。あなたはそのファイルの1つのバージョンを選択するか、またはファイルの全体を削除しないことを期待しました。

git rerereについてもっと知りたい場合は、git manual pagesを読むことをおすすめします。

この問題に記載されている問題の実例に興味があり、解決策(さらに多くの情報があると思います)がある場合は、次の手順に従ってください。私はそれがかなり長いことを知っていますが、私はその問題をどのように明確にすることができないのか分かりません。テストコードに適したディレクトリで

...

  1. $ mkdir test_rerere
  2. $ cd test_rerere
  3. $ git init
  4. $ cd .git
  5. $ mkdir rr-cache
  6. $ cd ..
  7. は、次のコード

    #! /usr/bin/env ruby 
    
    def hello 
        puts 'hello world' 
    end 
    
  8. $ git commit -a -m"added hello.rb"
  9. 別れという名前のファイルを作成してhello.rbという名前のファイルを作成します。次のコードhello.rbではいはいへ

    #! /usr/bin/env ruby 
    
    def bye 
        puts "goodbye world" 
    end 
    
  10. $ git commit -m"added goodbye.rb"
  11. $ git branch i18-world
  12. 変更ハロー
  13. $ git commit -a -m"changed hello to hola in hello.rb"
  14. $ git checkout i18-world
  15. 変更の世界とRBはhello.rbにムンドする
  16. $ git commit -a -m"changed world to mundo in hello.rb"
  17. goodbye.rb
  18. $ git commit -a -m"changed world to mundo in goodbye.rb" にムンドするgoodbye.rb
  19. $ git commit -a -m"changed goodbye to adios in goodbye.rb"
  20. $ git checkout master
  21. 変更の世界でADIOSへ
  22. 変更さよなら今、私たちは似ている二つのファイルで、二つの枝を持っていますが、同一ではありません。それぞれのファイルが両方のブランチにあるように見てください。
  23. $ git statusあなたは競合状態ではない、とそのをrerereやっている

    On branch master 
    nothing to commit, working tree clean 
    
  24. $ git merge i18-world
  25. あなたはこのようなものを取得する必要があります

    ...

    Auto-merging hello.rb 
    CONFLICT (content): Merge conflict in hello.rb 
    Auto-merging goodbye.rb 
    CONFLICT (content): Merge conflict in goodbye.rb 
    Recorded preimage for 'goodbye.rb' 
    Recorded preimage for 'hello.rb' 
    Automatic merge failed; fix conflicts and then commit the result. 
    
  26. を言う必要があります仕事...通知記録されたpreimage上記のログ。
  27. $ git rerere statusは、この競合のために両方のファイルが記録されているため、goodbye.rbとhello.rbを返します。 git rerere diffgit ls-files -uを試してみるのは楽しいことではありません。エラー状態を作りましょう。
  28. 最初に、hello.rbを解決してhola mundoを印刷し、コミットせずに$ git rm goodbye.rbとします。 これにより、エラーが発生します。 $ git statusで実際にgoodbye.rbが削除されていることを確認してください(gitが苦情を申しましたが)hello.rbが変更され、マージの準備ができました。
  29. $ git commit -a -m"HUH?"
  30. あなたはこの時点で取得エラーが問題で説明したエラーと全く同じであり、我々はまた、その録画プレイメージビットが現れたときに何が起こったのかについての巨大な手掛かりを持っていることに注意してください。さて、それが本当に壊れていることを確認しましょう。
  31. $ git log --oneline --decorate --graph --all私たちのコミット履歴のかなりの写真を見てください。
  32. hello.rbを 'hola mundo'から 'hola chica bonita'に変更します。
  33. $ git commit -a -m"changed 'hola mundo' to 'hola chica bonita!' in hello.rb"
  34. エラーがまだ現れ、そして我々はまだ録画プレイメージを取得していることに注意してください。
  35. $ git rerere statusは依然としてプレイメージに記録されているため、goodbye.rbを返すはずです。
  36. $ git rerere diffはgoodbye.rbが存在しないため、致命的なエラーを返します。鮮明な画像のために
  37. 、再び$ git log --oneline --decorate --graph --all
  38. git statusgit rerere statusは、この未解決の状態で同じものを返さないことに気づきます。あなたの作業ディレクトリにgoodbye.rbが存在しないことを自分自身の正気で確認してください。
  39. 今、マージの直前に行ったコミットをチェックすることで、厄介なエラーメッセージを修正できます。あなたのコミットメッセージをフォローしているなら、それは "goodbye.bの中のadiosへのさよならを変えた"というものです。 hello.rbでの作業を台無しにしたくないので、ファイル固有のチェックアウトを使用します($ git checkout **yoursha1** goodbye.rb)。
  40. hello.rbが変更されていないことを確認します。 'hola chica bonita!'と言わなければならない。
  41. BIG FIX!git rerere ... Ta Da! 通知そのgitは言うのための記録された解決策 'goodbye.rb'。
  42. あなたが混乱していなければ、ブラボー!これは当初私にはとても混乱していましたが、私は既に気づいたことを思い出しました...私がすでに適用した決議を再利用するのはかわいそうでした。唯一の不満は、ファイルの下からファイルを削除し、追いつく機会を与えられていないことでした。 goodbye.rbが再び存在するようになった今、持ち歩いていた参照を削除し、goodbye.rbが存在しなかった世界に住んでいることは喜ばしいことです。魔法のように、それ以上のエラーはありません。
  43. あなたがまだ懐疑的なので、私はあなたにそれを証明します。
  44. $ git checkout i18-world
  45. $ git rebase master
  46. $ git status戻りnothing to commit, working tree clean
  47. $ ls戻っ "hello.rbは、" 私たちは、我々はその厄介なgoodbye.rbファイルを取り除くされていることを知っています。
  48. $ git log --oneline --decorate --graph --allは私たちの勤勉さをすべて示しています。
  49. $ git rerere statusは、何も記録されていないので何も返しません(プリイメージはありません)。
  50. $ cat hello.rbは私たちから

    #! /usr/bin/env ruby 
    
    def hello 
        puts 'hola chica bonita!' 
    end 
    
  51. 変更hello.rb示し 'はいはいチカボニータを!' 「ホラーチカボニータ!テアモ '。
  52. $ git commit -a -m"updated hello in hello.rb to say 'hola chica bonita! te amo"
  53. git log --oneline --decorate --graph --all i18-worldはマスターに先んじていることがわかります。
  54. $ git checkout master
  55. $ git merge i18-world
  56. $ git branchi18-world *master
  57. $ git branch -d i18-world

を返す必要があります今、あなたの作業ディレクトリがクリーンでエラーフリーであることを確信することができます。また、「goodbye.rb」が存在する州に戻る必要がある場合は、あなたもできます!

この回答の長さをお詫び申し上げますが、うまくいけば、どこが間違っているのか、そして(この小さな例では)どれほど簡単に解決できるのかを理解していただければうれしいです。

+0

ありがとう、 'git rerere clear'はそれをやった!私はあなたの答えを少し拡大してもらえますか?私の検索能力の中で、この状況はSOでカバーされていません。そして、私はポインタを得て、(おそらく)正しい呪文を投げかけている間に、私はむしろ何が起こったかを完全には理解していない。 – kkm

+0

応答が遅れて申し訳ありませんが、エラーコードを再作成するまでに時間がかかりました。あなたが私の事例に従う時間があれば、私はあなたが何が起こったのか、それを将来どのように防止するのかを理解することを確信しています。あなたが 'git rerere clear'を使用したときに、あなたが解決したすべての解決記録を投げ捨ててしまった可能性があります。これは、あなたが似たような状況に遭遇した場合、将来あなたが探しているものではないかもしれません。 〜良いおかげで、私は割り当てを学んだ! – quarterpi

+0

すばらしい、ありがとう! – kkm

関連する問題