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。
-
相关:stackoverflow.com/questions/4611512/
-
我同意你。 我正在处理带有子模块的项目,每次拉动后我都应该执行git子模块更新,但是在大多数时候它是不必要的。 这样做的唯一理由-当子模块之一实际被更新时,不要错过。
我认为不自动更新的子模块符合Git的开发目标。 Git旨在以分布式模式工作,并且除非您明确告知,否则它甚至不会假定您甚至可以连接到非本地存储库。考虑到这种方式,Git不自动刷新子模块将是预期的行为。
话虽如此,如果您知道您始终希望将这些子模块引入,并且您永远不会将这些子模块分支到另一个本地存储库,那么如果您在之后自动刷新它们,则它不会破坏任何内容结帐。
-
我认为git checkout应该只是抱怨子模块的提交不可用,而不是默认使工作目录处于不一致状态。然后,您可以进行git子模块更新以获取引用的提交。同样,通常,提交将可用,并且无需任何网络访问即可完成签出。接受您的回答,因为这听起来很合理(但我不喜欢它;)
-
我第二个想法是git应该尝试执行子模块init并在初始签出时进行更新,并抱怨并显示状态,如果存在尚未在本地首次拉出的子模块。一旦有了它,需要显式更新的想法就很有意义了,因为存储库是不同的,并且子模块引用了特定的提交。但是即使在可能无法使用它的分布式世界中,您也很可能会在某个时候想要它,而git应该让您知道它从未被拉过。
-
git fetch具有自动获取子模块的选项,因此我同样认为checkout应该具有类似的选项来自动更新/检出子模块。
-
考虑到这种方式,Git不自动刷新子模块将是预期的行为。" -我不明白为什么。确实,我看不出您的第一段中的任何点与Git在拉动时是否应自动尝试更新子模块的问题有任何关联。
-
当您要在存储库上执行工作时,Git不会假定您始终有权访问从中签出的存储库。相反,一旦克隆,您的存储库就可以完全独立发挥作用。如果最初的假设是您仅在接到通知时才连接到外部存储库,那么结果就是Git不应该自动刷新我正在尝试传达的子模块。
-
是的,但是我希望git fetch确保所有包含的子模块都已获取包含存储库中所有提交所引用的所有提交。如果是这样,那么任何后续的顶级git checkout都可以签出正确的子模块提交,而无需网络访问。
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默认行为,这违背了大多数用户的期望并限制了子模块的采用,我真的希望开发人员能够对其进行更改。
-
submodule.recurse似乎从git 2.14开始工作。
-
@Kane感谢您提供信息,并更新了答案。
-
我已将submodule.recurse设置为true,但我发现在git checkout之后仍需要做git submodule update --init --recursive的时间(我想在子模块的添加之间来回跳转)。有没有办法使这种情况自动发生?