当使用 git checkout 切换分支时,我会假设大多数时候你会想要更新你的子模块。
- 什么情况下不想在切换后更新子模块?
- 如果这是由 git checkout 自动完成的,会发生什么?
更新示例:
- 分支 A 在 3852f1 有子模块 S
- 分支 B 在 fd72d7 有子模块 S
在分支 A 上, git checkout B 将生成分支 B 的工作副本,其中子模块 S 位于 3852f1(带有修改的 S)。git submodule update 将在 fd72d7 签出 S。
当使用 git checkout 切换分支时,我会假设大多数时候你会想要更新你的子模块。
更新示例:
在分支 A 上, git checkout B 将生成分支 B 的工作副本,其中子模块 S 位于 3852f1(带有修改的 S)。git submodule update 将在 fd72d7 签出 S。
git checkout --recurse-submodules
已添加到 git 2.13
submodule.recurse
选项已添加到 git 2.14
设置:
git config --global submodule.recurse true
man git-config
说:
指定命令是否默认递归到子模块中。这适用于所有具有
--recurse-submodules
选项的命令。默认为假。
我觉得默认不更新模块是一个糟糕的 Git 默认行为,它违背了大多数用户的期望并限制了子模块的采用,我真的希望开发人员能够改变它。
我相信不自动更新的子模块符合 Git 的开发目标。Git 旨在以分布式模式工作,并且不假定您甚至可以连接到非本地存储库,除非您明确告诉它这样做。考虑到这种方式,Git 不会自动刷新子模块将是预期的行为。
话虽如此,如果你知道你总是希望这些子模块被拉入并且你知道你永远不会将这些子模块分支到另一个本地存储库,那么如果你在之后自动刷新它们就不应该破坏任何东西结帐。
使用 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-submodules
fetch 中会影响填充的子模块,但生成的工作树更新只会影响活动的子模块。在 的文档中
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中列出)。doc
fetch
push
.recurseSubmodules
git config
现在在其手册页中包含:
一个布尔值,指示命令是否应
--recurse-submodules
默认启用该选项。适用于支持此选项的所有命令。