为什么git submodule在git checkout上不会自动更新?

时间:2009-12-14 09:05:39

标签: git git-submodules

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

  • 你在什么情况下想要在切换后更新子模块?
  • 如果这是由git checkout自动完成会破坏什么?

更新了示例:

  • 分支A的子模块S为3852f1
  • 分支B在fd72d7
  • 处有子模块S.

在分支A上,git checkout B将导致分支B的工作副本,子模块S为3852f1(带有修改的S)。 git submodule update将在fd72d7结帐S.

3 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:14)

with open(filename, 'rb') as f: 已添加到git 2.13

https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

的发行说明中提到了这一点

git checkout --recurse-submodules选项已添加到git 2.14

设为:

submodule.recurse

git config --global submodule.recurse true 说:

  

指定默认情况下命令是否递归到子模块。这适用于具有man git-config选项的所有命令。默认为false。

答案 2 :(得分:2)

在Git 2.27(2020年第二季度)中,“ --recurse-submodules”选项的文档更好。

请参见commit acbfae3commit 4da9e99commit d09bc51commit b3cec57commit dd0cb7dDamien Robert (damiens-robert)(2020年4月6日)。
(由Junio C Hamano -- gitster --commit cc908db中合并,2020年4月28日)

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

签名人:Damien Robert
帮助者:菲利普·布兰

该文档涉及“初始化的”或“填充的”子模块,以说明哪些子模块受“ --recurse-submodules”的影响,但此处的实际术语是“ active ”。 '子模块。相应地更新文档。

一些术语:

  • Active is defined in gitsubmodules(7),它仅涉及配置变量'submodule.active','submodule.<name>.active'和'submodule.<name>.url'。
    函数submodule.c::is_submodule_active检查子模块是否处于活动状态。
  • 已填充表示存在子模块的工作树(并且gitfile正确指向子模块存储库),即,超级项目已使用--recurse-submodules克隆,或者用户运行了{{ 3}},或分别填充子模块工作树的git submodule update --initgit submodule init [<path>]
    这不涉及上面的3个配置变量。
  • 已初始化(至少在此补丁程序涉及的手册页中)是指以上定义的“填充”和“活动” ,即{{ 1}} git子模块更新--init [可以。

](https://git-scm.com/docs/git-submodule)选项主要影响活动子模块。

--recurse-submodules是一个例外,该选项影响填充的子模块。
结果,在git fetch中,访存会影响填充的子模块,但最终的工作树更新只会影响活动的子模块。

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