私は元々、いくつかの依存コードにサブモジュールを使用していたプロジェクトを持っています。サブモジュールはこのプロジェクトにはあまり適していない (実際には使いにくい) ことが判明したため、各サブモジュールをサブツリーに変換しています (新git-subtree
機能を使用)。
私の作業リポジトリでは、各サブモジュールを正常に削除し、古いサブモジュール リポジトリをサブツリーとして追加しました。これで問題ありません。
別のクローンに移動して最初のクローンからプルしようとすると、マージ ステップで次のエラーが発生します。
error: The following untracked working tree files would be overwritten by merge:
sub/.gitignore
sub/Makefile
sub/README
sub/src/main.c
... and so on for all files in sub/
Aborting
これは、ファイルがsub/
そもそもメイン リポジトリに実際に存在したことがなく、Git がパッチを適用して更新するとき.gitmodules
に、サブモジュール ファイルを含むディレクトリが削除されないことが原因のようです。次のコミットを処理するときに、Gitがsub/
現在メイン リポジトリの一部である に新しいファイルを作成しようとすると、それらのファイルはすべて にまだ存在するファイルと競合します。sub/
私が見つけた回避策は、この問題を回避するrm -rf sub
beforeを使用することです。git pull
私の質問は、git merge
「作業ディレクトリにたまたま存在するファイルを上書きする」というコマンドラインスイッチはありますか? さらに良いのはgit merge
、既存のファイルの内容を確認する機能であり、作成しようとしていたファイルと内容が同じ場合は、エラー メッセージを抑制して続行します。
更新:私が話していることを正確に示すために、この問題を示すGitリポジトリを作成しました。再現するには:
$ git clone https://github.com/ghewgill/q14224966.git
$ cd q14224966
$ git submodule init
$ git submodule update
$ git merge origin/branch
これにより、エラーメッセージが表示されるはずです
error: The following untracked working tree files would be overwritten by merge:
sub/Makefile
sub/README
sub/src/main.c
Please move or remove them before you can merge.
Aborting