这个问题Is there a way to make git pull automatically update submodules?的配置git的答案如下:
git config --global submodule.recurse true
就像对该答案的评论之一,我想知道为什么这不是git的默认行为;更准确地说,设置此配置选项的缺点是什么?
答案 0 :(得分:5)
此选项是在commit 046b482中引入的,最初用于工作树
操纵命令(read-tree
/ checkout
/ reset
)
git grep
/ fetch
/ pull
/ push
紧随其后。
但是,与the documentation mentions一样,与下面的其他命令不同,clone仍需要自己的递归标志:git clone --recurse-submodules <URL> <directory>
。
参见此recent discussion:
这是设计决定,因为
git clone
可能太大了。
也许我们需要重新考虑该决定,并且如果设置了submodule.recurse
,只需克隆子模块。
由于调用的子模块的数量/大小可能很大,因此默认情况下,目前默认情况下不递归包含这些子模块。
它们的主要缺点是,可能需要递归进入每个子模块(以及它们各自的子模块),从而可能导致时间开销。
如果您有很多,并且不需要全部 ,则最好不要选择该选项,并在需要时指定--recursive
。
但是,优点之一是在切换分支as seen in this discussion时避免看到“未跟踪的文件”。
答案 1 :(得分:1)
我有两个原因导致我最近又回到recurse=false
:
recurse=false
似乎已经缓解了它,但是再次:我没有完全调查问题。答案 2 :(得分:0)
这就是问题:人们将倾向于采用默认值,除非他们的工作流无法正常运行,并且由于Git支持的工作流多样性,Git的复杂性完全。
您的工作流程将大不相同,这取决于您是否在供应商基础上携带补丁(并且这也取决于您是在顶级仓库还是一个或多个子模块中),您要使用代码做什么(开发新功能?测试升级?只是简单地获取和构建?),项目的设置方式(是否始终需要所有子模块来构建每个配置?将可选功能拆分为单独的历史记录就可以得到大笔的回报),一切。
因此,调用与工作流程匹配或不匹配的默认值,您在使用“缺点”在我看来似乎错过了森林。不管如何设置出厂默认值,由于Git服务的工作流种类繁多,至少在某些存储库中,它们对于您的工作流可能都不是最佳选择。设置合适的默认值以适合您,其他人将会出现,问他们为什么默认使用递归获取所有内容。
我唯一可以明确地将自动递归设置为默认值的缺点是:考虑到任何人都认为该设置是否会匹配任何特定回购中的工作流程,并且工厂默认值必须是一个猜测,猜不到更昂贵的选择。
为所有工作打开自动递归配置很容易,但是即使您不必这样做,也可能会浪费大量时间进行克隆,根本就不需要。大型共享供应商历史记录的本地前端或参考站很容易。
答案 3 :(得分:0)
克隆或提取包含子模块的存储库时, 默认情况下,不会检出子模块;您可以指示克隆 递归到子模块。 git的init和update子命令 子模块将维护检出的子模块并在适当的时候 工作树中的版本。或者,您可以设置 submodule.recurse使结帐递归到子模块中。
来源:git-scm.com
此选项的缺点是克隆或提取包含多个子模块的存储库会降低性能。