当使用git checkout切换分支时,我会假设大多数时候你都想更新你的子模块。
更新示例:
在分支A上,git checkout B将得到分支B的工作副本,其中子模块S位于3852f1(修改后的S)。git submodule update将在fd72d7检出S。
fgw7neuy1#
git checkout --recurse-submodules已添加到git 2.13中
git checkout --recurse-submodules
以下位置的发行说明中提到了这一点:https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139
submodule.recurse选项被添加到git 2.14中
submodule.recurse
设置为:
git config --global submodule.recurse true
man git-config表示:指定默认情况下命令是否递归到子模块中。这适用于具有--recurse-submodules选项的所有命令。默认值为false。我觉得默认情况下不更新模块是一个糟糕的Git默认行为,它违背了大多数用户的期望,并限制了子模块的采用,我真的希望开发人员能改变它。
man git-config
--recurse-submodules
submodule.recurse使git fetch每次提取所有子模块
git fetch
这使得该选项基本上非常慢,因为即使子模块是最新的,当它试图从这些子模块中获取分支更新时,获取也会发生。我做了很多次获取来查看我的同事提交,所以我必须经常获取。与顶级repo相比,子模块的移动速度要慢得多,所以没有必要一直获取它们。所以现在我坚持使用Bash函数的解决方法:
gco() { git checkout --recurse-submodules "$@" }
ddhy6vgd2#
我相信不自动更新子模块是符合Git的开发目标的。Git的目的是在分布式模式下工作,并且不假设你甚至能够连接到一个非本地仓库,除非你明确地告诉它这样做。Git不自动刷新子模块将是预期的行为,当你这样想的时候。话虽如此,如果您知道您总是希望这些子模块被拉入,并且您知道您永远不会将这些子模块分支到另一个本地存储库,那么如果您在 checkout 后自动刷新它们,应该不会中断任何东西。
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日)
damiens-robert
gitster
doc
签署人:达米安·罗伯特协助人:菲利普·布莱恩文档引用"初始化"或"填充"子模块,以解释哪些子模块受'--recurse-submodules'影响,但这里真正的术语是'active'子模块。相应地更新文档。一些术语:
active
submodule.active
submodule.<name>.active
submodule.<name>.url
函数submodule.c::is_submodule_active检查子模块是否激活。
submodule.c::is_submodule_active
git submodule update --init
git submodule init [<path>]
git submodule update [<path>]
这不涉及上述3个配置变量。
[
](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日)
git pull --recurse-submodules
git-pull
phil-blain
签署人:菲利普·布莱恩"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选项。适用于支持此选项的所有命令。
git pull
git submodule update --recursive
fetch.recurseSubmodules
push.recurseSubmodules
fetch
push
.recurseSubmodules
git config
3条答案
按热度按时间fgw7neuy1#
git checkout --recurse-submodules
已添加到git 2.13中以下位置的发行说明中提到了这一点:https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139
submodule.recurse
选项被添加到git 2.14中设置为:
man git-config
表示:指定默认情况下命令是否递归到子模块中。这适用于具有
--recurse-submodules
选项的所有命令。默认值为false。我觉得默认情况下不更新模块是一个糟糕的Git默认行为,它违背了大多数用户的期望,并限制了子模块的采用,我真的希望开发人员能改变它。
submodule.recurse
使git fetch
每次提取所有子模块这使得该选项基本上非常慢,因为即使子模块是最新的,当它试图从这些子模块中获取分支更新时,获取也会发生。
我做了很多次获取来查看我的同事提交,所以我必须经常获取。与顶级repo相比,子模块的移动速度要慢得多,所以没有必要一直获取它们。
所以现在我坚持使用Bash函数的解决方法:
ddhy6vgd2#
我相信不自动更新子模块是符合Git的开发目标的。Git的目的是在分布式模式下工作,并且不假设你甚至能够连接到一个非本地仓库,除非你明确地告诉它这样做。Git不自动刷新子模块将是预期的行为,当你这样想的时候。
话虽如此,如果您知道您总是希望这些子模块被拉入,并且您知道您永远不会将这些子模块分支到另一个本地存储库,那么如果您在 checkout 后自动刷新它们,应该不会中断任何东西。
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
'子模块。相应地更新文档。一些术语:
submodule.active
','submodule.<name>.active
'和'submodule.<name>.url
'.函数
submodule.c::is_submodule_active
检查子模块是否激活。--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
选项。适用于支持此选项的所有命令。