当使用git checkout切换分支时,我会假设大多数时候您都想更新子模块。
- 在什么情况下,你不希望更新子模块切换后?
- 如果通过git checkout自动完成该操作会怎样?
更新了示例:
- 分支A在3852f1具有子模块S
- 分支B在fd72d7具有子模块S
在分支A上,git checkout B将生成分支B的工作副本,其子模块为3852f1(具有经过修改的S)。git子模块更新将在fd72d7检出S。
当使用git checkout切换分支时,我会假设大多数时候您都想更新子模块。
更新了示例:
在分支A上,git checkout B将生成分支B的工作副本,其子模块为3852f1(具有经过修改的S)。git子模块更新将在fd72d7检出S。
Answers:
我认为不自动更新的子模块符合Git的开发目标。Git旨在以分布式模式工作,并且除非您明确告知,否则它甚至不会假定您甚至可以连接到非本地存储库。考虑到这种方式,Git不自动刷新子模块将是预期的行为。
话虽如此,如果您知道您始终希望引入这些子模块,并且您永远不会将这些子模块分支到另一个本地存储库,那么如果您在之后自动刷新它们,则它不会破坏任何内容结帐。
git fetch
有一个选项可以自动获取子模块,所以同样,我认为签出应该有一个类似的选项来自动更新/签出子模块。
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默认行为,这违背了大多数用户的期望,并限制了子模块的采用,我真的希望开发人员能够对其进行更改。
submodule.recurse
似乎从git 2.14开始工作。
submodule.recurse
设定为true
,但我觉得还是有次(来回跳跃跨越另外一个子模块的,我觉得呢?),我必须做git submodule update --init --recursive
我的后git checkout
。有没有办法使这种情况自动发生?
在Git 2.27(2020年第二季度)中,“ --recurse-submodules
”选项的文档更好。
请参阅Damien Robert()的commit acbfae3,commit 4da9e99,commit d09bc51,commit b3cec57和commit dd0cb7d(2020年4月6日)。damiens-robert
(通过合并JUNIOÇ滨野- gitster
-在提交cc908db 4月28日2020)
doc
:--recurse-submodules
主要适用于活动子模块签字人:达米恩·罗伯特签字人
:菲利普·布兰该文档指的是“已初始化”或“填充”子模块,以解释哪些子模块受“
--recurse-submodules
”影响,但此处的真正术语是“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子模块更新--init的](https://git-scm.com/docs/git-submodule)
作用。该
--recurse-submodules
选项主要影响活动的子模块。一个例外是
git fetch
该选项影响填充的子模块。
结果,git pull --recurse-submodules
访存中会影响填充的子模块,但最终的工作树更新只会影响活动的子模块。在的文档中
git-pull
,让我们区分影响填充子模块的获取部分和仅影响活动子模块的工作树更新。