ディレクトリ src と、src の内容を含むディレクトリ src_ref がありましたが、いくつかの方法でリファクタリングされました。src_ref を src に、src を src_dep に名前を変更し、後にコミットしましたgit add -A
。git が行ったことは意味がなく、git の内部構造が理解できません。発生する決定論的な動作は次のとおりです。
In the diff log it makes no mention of the directory src_dep.
The files now in src form src_ref are commited as new files.
別のブランチに切り替えようとした後、次のように表示されます。
fatal: Out of memory? mmap failed: File exists
ただし、ブランチを部分的にチェックアウトします。もちろん、コマンドを再度実行すると、作業ディレクトリ内のファイルのサブセットが変更されたことが示されます。
これらの変更をコミットしても (ブランチの部分的なチェックアウトが原因) fatal: Out of memory? mmap failed: File exists
、他のブランチを再チェックアウトしようとすると、エラーが発生します。
コミットが src_dep への参照を持っていないように見えるという事実に関する関連部分:git reset --hard HEAD~
コミットを行うと、上で指定したように diff に存在していないように見えますが、src_dep ディレクトリが再作成されます。
このタイプの破損は git の使用にとって壊滅的であるように思われます (私の場合、データを破損する技術に対処することに興味がないため、完全に使用を中止するため)。これを修正する唯一の合理的な方法はすべての分岐を失う git リポジトリを再作成するか、次のようにします。
Save the changes from the commit that caused the fatal: Out of memory? mmap failed: File exists
git reset --hard HEAD~
Apply the changes manually again and pick a different way to change src_ref to src
質問は次のとおりです。
- 論理的に正しい差分は、src_ref から src へのファイルの移動と、src から src_dep へのファイルの移動です。これは確かに、src 内に多数のファイルが作成され、一部が src_ref から src に移動され、差分で src_dep への参照がまったくない場合には発生しません。おそらくいくつかの差分設定を使用して、gitが正しいロジックを実装することは可能ですか?
- わずかに変更されたファイルを含むディレクトリを、既にコミットされているディレクトリに変更することに関して、これは文書化され、予想される動作ですか? つまり、壊れたり破損したりしないリポジトリのバージョン管理を優先して、src_ref を src に変更できるようにしたいと考えています (つまり、論理的に正しい動きがあればいいのですが、単にリポジトリは壊れていません)。
- 最終的に新しい src としてコミットする必要がある重複したリファクタリングされたディレクトリを作成するつもりなので、これを解決するための操作のパターンは何ですか?