88

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

  • 什么情况下不想在切换后更新子模块?
  • 如果这是由 git checkout 自动完成的,会发生什么?

更新示例:

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

在分支 A 上, git checkout B 将生成分支 B 的工作副本,其中子模块 S 位于 3852f1(带有修改的 S)。git submodule update 将在 fd72d7 签出 S。

4

3 回答 3

46

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选项的命令。默认为假。

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

于 2017-05-08T18:13:43.010 回答
27

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

话虽如此,如果你知道你总是希望这些子模块被拉入并且你知道你永远不会将这些子模块分支到另一个本地存储库,那么如果你在之后自动刷新它们就不应该破坏任何东西结帐。

于 2009-12-14T09:13:34.343 回答
4

使用 Git 2.27(2020 年第二季度),“ --recurse-submodules”选项得到了更好的记录。

请参阅Damien Robert ( )的提交 acbfae3提交 4da9e99提交 d09bc51提交 b3cec57提交 dd0cb7d(2020 年 4 月 6 日) 。(由Junio C Hamano 合并 -- --cc908db 提交中,2020 年 4 月 28 日)damiens-robert
gitster

doc--recurse-submodules主要适用于活动子模块

签字人:Damien Robert
协助人:Philippe Blain

文档中提到了“初始化”或“填充”子模块,以解释哪些子模块受 ' --recurse-submodules' 影响,但这里真正的术语是 ' active' 子模块。相应地更新文档。

一些术语:

  • Active定义在 gitsubmodules(7)中,只涉及配置变量 'submodule.active', 'submodule.<name>.active' 和 'submodule.<name>.url'。
    该函数submodule.c::is_submodule_active检查子模块是否处于活动状态。
  • 已填充意味着子模块的工作树存在(并且 gitfile 正确指向子模块存储库),即超级项目是用 克隆的--recurse-submodules,或者用户运行的git submodule update --init,或者git submodule init [<path>]分别git submodule update [<path>]填充了子模块工作树。
    这不涉及上面的3个配置变量。
  • 初始化(至少在本补丁所涉及的手册页的上下文中)意味着如上所述的“填充”和“活动”[ ,即git submodule update --init](https://git-scm.com/docs/git-submodule)所做的。

--recurse-submodules选项主要影响活动子模块。

一个例外是git fetch该选项影响填充的子模块。
因此,在git pull --recurse-submodulesfetch 中会影响填充的子模块,但生成的工作树更新只会影响活动的子模块。

在 的文档中git-pull,让我们区分影响填充子模块的获取部分和仅影响活动子模块的工作树的更新。


使用 Git 2.33(2021 年第三季度),文档submodule.recurse更加清晰:

请参阅Philippe Blain ( ) 的commit 878b399(2021 年 7 月 16 日(由Junio C Hamano 合并 -- --提交 c018818中,2021 年 8 月 2 日)phil-blain
gitster

doc:澄清“submodule.recurse”的描述

签字人:Philippe Blain

' ' 的文档submodule.recurse以“指定命令是否默认递归到子模块”开头。
并非所有具有 ' --recurse-submodules' 选项的命令都如此。
例如,' git pull --recurse-submodules' ( man )不会在每个子模块中运行 ' git pull' ( man ),而是运行 ' git submodule update --recursive' ( man )以便拉取后的子模块工作树与超级项目中记录的提交匹配。

通过说它启用' --recurse-submodules'来澄清这一点。

请注意,自4da9e99以来,此设置与 ' fetch.recurseSubmodules' 和 ' push.recurseSubmodules' 的交互方式已被记录(“ :在 ( | )上更精确”,2020-04-06,Git v2. 27.0-rc0 -合并在批次 #4中列出)。docfetchpush.recurseSubmodules

git config现在在其手册页中包含:

一个布尔值,指示命令是否应--recurse-submodules默认启用该选项。适用于支持此选项的所有命令。

于 2020-05-01T21:33:33.697 回答