为什么git checkout 时git子模块不自动更新?

7xzttuei  于 2023-02-28  发布在  Git
关注(0)|答案(3)|浏览(186)

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

  • 在什么情况下,您希望在切换后更新子模块?
  • 如果这是git checkout自动完成的,会有什么问题?

更新示例:

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

在分支A上,git checkout B将得到分支B的工作副本,其中子模块S位于3852f1(修改后的S)。git submodule update将在fd72d7检出S。

fgw7neuy

fgw7neuy1#

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 fetch每次提取所有子模块

这使得该选项基本上非常慢,因为即使子模块是最新的,当它试图从这些子模块中获取分支更新时,获取也会发生。
我做了很多次获取来查看我的同事提交,所以我必须经常获取。与顶级repo相比,子模块的移动速度要慢得多,所以没有必要一直获取它们。
所以现在我坚持使用Bash函数的解决方法:

gco() { git checkout --recurse-submodules "$@" }
ddhy6vgd

ddhy6vgd2#

我相信不自动更新子模块是符合Git的开发目标的。Git的目的是在分布式模式下工作,并且不假设你甚至能够连接到一个非本地仓库,除非你明确地告诉它这样做。Git不自动刷新子模块将是预期的行为,当你这样想的时候。
话虽如此,如果您知道您总是希望这些子模块被拉入,并且您知道您永远不会将这些子模块分支到另一个本地存储库,那么如果您在 checkout 后自动刷新它们,应该不会中断任何东西。

nhaq1z21

nhaq1z213#

在Git 2.27(Q2 2020)中,"--recurse-submodules"选项被更好地记录。
参见第commit acbfae3条、第commit 4da9e99条、第commit d09bc51条、第commit b3cec57条、第commit dd0cb7d条(2020年4月6日)和第Damien Robert ( damiens-robert )条。
(由Junio C Hamano -- gitster --合并至commit cc908db,2020年4月28日)

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

签署人:达米安·罗伯特
协助人:菲利普·布莱恩
文档引用"初始化"或"填充"子模块,以解释哪些子模块受'--recurse-submodules'影响,但这里真正的术语是'active'子模块。相应地更新文档。
一些术语:

      • 活动**在gitsubmodules(7)中定义,它只涉及配置变量'submodule.active','submodule.<name>.active'和'submodule.<name>.url'.

函数submodule.c::is_submodule_active检查子模块是否激活。

      • Populated**表示子模块的工作树存在(gitfile正确地指向子模块仓库),也就是说,要么超级项目是用--recurse-submodules克隆的,要么用户运行了git submodule update --init,或者分别运行了git submodule init [<path>]git submodule update [<path>]来填充子模块的工作树。

这不涉及上述3个配置变量。

      • 初始化**(至少在本补丁涉及的手册页上下文中)表示如上定义的"已填充"和"活动",即[ git子模块update--init ](https://git-scm.com/docs/git-submodule)所做的事情。

--recurse-submodules选项主要影响活动子模块。
git fetch是一个例外,该选项影响填充的子模块。
因此,在git pull --recurse-submodules中,获取会影响已填充的子模块,但所产生的工作树更新只会影响活动的子模块。
git-pull的文档中,让我们区分影响填充子模块的获取部分和只影响活动子模块的工作树更新。
在Git 2.33(Q3 2021)中,submodule.recurse的文档更加清晰:
参见Philippe Blain ( phil-blain )commit 878b399(2021年7月16日)。
(由Junio C Hamano -- gitster --合并至commit c018818,2021年8月2日)

doc:澄清"子模块. recurse"的描述

签署人:菲利普·布莱恩
"submodule.recurse"的文档以"指定默认情况下命令是否递归到子模型"开头。
并非所有具有"--recurse-submodules"选项的命令都是如此。
例如,'git pull --recurse-submodules'(man)不会在每个子模块中运行'git pull'(man),而是运行'git submodule update --recursive'(man),以便拉取后的子模块工作树与超级项目中记录的提交相匹配。
澄清这一点,只需说它启用了"--recurse-submodules"。
请注意,此设置与"fetch.recurseSubmodules"和"push.recurseSubmodules"(可以具有true或false以外的其他值)交互的方式已经记录在案,因为4da9e99("doc:在(fetch)上更精确|push.recurseSubmodules ",2020年4月6日,Git版本2.27.0-rc0--在batch #4中列出的merge)。
git config现在在其手册页中包括:
一个布尔值,指示命令是否应默认启用--recurse-submodules选项。适用于支持此选项的所有命令。

相关问题