web-dev-qa-db-ja.com

gitのチェックアウト時にgitサブモジュールの更新が自動的に行われないのはなぜですか?

Git checkoutでブランチを切り替えるとき、ほとんどの場合、サブモジュールを更新する必要があると思います。

  • どのような状況でnot切り替え後にサブモジュールを更新しますか?
  • これがgit checkoutによって自動的に行われた場合、何が壊れますか?

例で更新:

  • ブランチAには、3852f1にサブモジュールSがあります。
  • ブランチBはfd72d7にサブモジュールSを持っています

ブランチAでは、gitチェックアウトBを実行すると、ブランチBの作業用コピーがサブモジュールSに3852f1で(変更されたSを使用して)作成されます。 git submodule updateはfd72d7でSをチェックアウトします。

67
serbaut

自動的に更新されないサブモジュールは、Gitの開発目標と一致していると思います。 Gitは分散モードで動作することを意図しており、明示的に指示しない限り、ローカル以外のリポジトリに接続できるとは想定していません。 Gitがサブモジュールを自動更新しないのは、そのように考えると予想される動作です。

そうは言っても、それらのサブモジュールを常にプルインしたいことがわかっていて、それらのサブモジュールから別のローカルリポジトリに分岐しないことがわかっている場合は、後で自動的に更新しても問題はありません。チェックアウト。

22
Aaron

git checkout --recurse-submodulesがgit 2.13に追加されました

これは次のリリースノートで言及されています https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

submodule.recurseオプションがgit 2.14に追加されました

として設定され:

git config --global submodule.recurse true

man git-configさんのコメント:

コマンドがデフォルトでサブモジュールに再帰するかどうかを指定します。これは、--recurse-submodulesオプションを持つすべてのコマンドに適用されます。デフォルトはfalseです。

デフォルトでモジュールを更新しないことは、ほとんどのユーザーの期待に反し、サブモジュールの採用を制限する悪いGitデフォルト動作であると私は感じています。