为什么git checkout不会自动更新git子模块?

Why is git submodule update not automatic on git checkout?

当使用git checkout切换分支时,我会假设大多数时候您都想更新子模块。

  • 在什么情况下您不想在切换后更新子模块?
  • 如果这是通过git checkout自动完成的,那会怎样?

更新示例:

  • 分支A在3852f1具有子模块S
  • 分支B在fd72d7具有子模块S

在分支A上,git checkout B将产生分支B的工作副本,其子模块为3852f1(具有修改的S)。 git子模块更新将在fd72d7检出S。


我认为不自动更新的子模块符合Git的开发目标。 Git旨在以分布式模式工作,并且除非您明确告知,否则它甚至不会假定您甚至可以连接到非本地存储库。考虑到这种方式,Git不自动刷新子模块将是预期的行为。

话虽如此,如果您知道您始终希望将这些子模块引入,并且您永远不会将这些子模块分支到另一个本地存储库,那么如果您在之后自动刷新它们,则它不会破坏任何内容结帐。


git checkout --recurse-submodules已添加到git 2.13

在发行说明中提到了这一点:https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

submodule.recurse选项已添加到git 2.14

设置:

1
git config --global submodule.recurse true

man git-config说:

Specifies if commands recurse into submodules by default. This applies to all commands that have a --recurse-submodules option. Defaults to false.

我觉得默认情况下不更新模块是一个糟糕的Git默认行为,这违背了大多数用户的期望并限制了子模块的采用,我真的希望开发人员能够对其进行更改。