将git的submodule.recurse config选项设置为true有什么缺点?

时间:2018-11-28 07:49:15

标签: git git-submodules

这个问题Is there a way to make git pull automatically update submodules?的配置git的答案如下:

git config --global submodule.recurse true

就像对该答案的评论之一,我想知道为什么这不是git的默认行为;更准确地说,设置此配置选项的缺点是什么?

4 个答案:

答案 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

  • 我有我的项目需要的子模块(来自github的第三方库),但是它们有我不需要的子模块。即-多个实例。我没有为第三方库构建测试,因此获取它们会浪费时间和空间
  • 如果回购中的子模块远程更改,我会遇到问题。通常当我决定需要对库进行一些修改并且将其推送到上游不可行时,通常会发生这种情况。我没有真正研究它,因为从头开始克隆总是比子模块混乱更容易。 recurse=false似乎已经缓解了它,但是再次:我没有完全调查问题。

答案 2 :(得分:0)

这就是问题:人们将倾向于采用默认值,除非他们的工作流无法正常运行,并且由于Git支持的工作流多样性,Git的复杂性完全

您的工作流程将大不相同,这取决于您是否在供应商基础上携带补丁(并且这也取决于您是在顶级仓库还是一个或多个子模块中),您要使用代码做什么(开发新功能?测试升级?只是简单地获取和构建?),项目的设置方式(是否始终需要所有子模块来构建每个配置?将可选功能拆分为单独的历史记录就可以得到大笔的回报),一切。

因此,调用与工作流程匹配或不匹配的默认值,您在使用“缺点”在我看来似乎错过了森林。不管如何设置出厂默认值,由于Git服务的工作流种类繁多,至少在某些存储库中,它们对于您的工作流可能都不是最佳选择。设置合适的默认值以适合您,其他人将会出现,问他们为什么默认使用递归获取所有内容。

我唯一可以明确地将自动递归设置为默认值的缺点是:考虑到任何人都认为该设置是否会匹配任何特定回购中的工作流程,并且工厂默认值必须是一个猜测,猜不到更昂贵的选择。

为所有工作打开自动递归配置很容易,但是即使您不必这样做,也可能会浪费大量时间进行克隆,根本就不需要。大型共享供应商历史记录的本地前端或参考站很容易。

答案 3 :(得分:0)

  

克隆或提取包含子模块的存储库时,   默认情况下,不会检出子模块;您可以指示克隆   递归到子模块。 git的init和update子命令   子模块将维护检出的子模块并在适当的时候   工作树中的版本。或者,您可以设置   submodule.recurse使结帐递归到子模块中。

来源:git-scm.com

此选项的缺点是克隆或提取包含多个子模块的存储库会降低性能。