这个问题Is there a way to make git pull automatically update submodules?有一个可接受的答案,就是这样配置git:
git config --global submodule.recurse true
就像对那个答案的评论一样,我想知道为什么这不是git的默认行为;更准确地说,设置此配置选项有哪些缺点?
这个问题Is there a way to make git pull automatically update submodules?有一个可接受的答案,就是这样配置git:
git config --global submodule.recurse true
就像对那个答案的评论一样,我想知道为什么这不是git的默认行为;更准确地说,设置此配置选项有哪些缺点?
5条答案
按热度按时间okxuctiv1#
此选项是在commit 046b482中引入的,最初用于处理树操作命令(
read-tree
/checkout
/reset
)一米三纳米一x/一米四纳米一x/一米五纳米一x/一米六纳米一x很快就出现了。
但是,正如文档中提到的,与下面的其他命令不同,clone仍然需要自己的recurse标志:
git clone --recurse-submodules <URL> <directory>
.请参见此recent discussion:
这是一个设计决策,一旦推出,因为
git clone
可能太大。也许我们需要重新考虑这个决定,如果设置了
submodule.recurse
,就克隆子模块。由于所涉及的子模块的数量/大小可能很大,因此目前的默认行为是不递归地包含它们。
它们的主要缺点是由于必须在每个子模块(以及它们自己的子模块)中递归地进行而可能引入的时间开销。
如果您有很多这样的变量,并且不需要 * 所有 * 变量,那么最好关闭该选项,并在需要时指定
--recursive
。然而,一个优点是避免在切换分支as seen in this discussion时看到“未跟踪的文件”。
注意,从Git 2.34(Q4 2021)开始,一个
git clone --recurse-submodules
意味着一个简单的git pull
将递归到子模块中。即使
git config --global submodule.recurse
* 未 * 设置。请参见“Is there a way to make
git pull
automatically update submodules?“。zujrkrfu2#
我最近之所以回到
recurse=false
,有两个原因:recurse=false
似乎缓解了它,但再次:我没有充分调查这个问题。zujrkrfu3#
事情是这样的除非工作流不能正确运行,否则人们倾向于使用默认值,而Git的复杂性完全是由于它支持的工作流的多样性。
您的工作流将根据您是否在供应商基础上提供修补程序而有很大的不同(这也取决于它是在顶层存储库中还是在一个或多个子模块中)、您尝试用代码做什么(开发新功能?测试升级?只是简单的获取和构建?),项目是如何建立的(所有的子模块都是构建每个配置所必需的吗?将可选的特性分割成单独的历史可以带来巨大的回报),所有的一切。
因此,调用与你正在使用的工作流匹配或不匹配的默认值是一个“缺点”。在我看来,这是只见树木不见森林。无论出厂默认值是如何设置的,至少在一些回购中,它们很可能对你的工作流来说是次优的,这正是因为Git服务的工作流种类繁多。其他人会问为什么默认情况下递归地获取所有内容。
我唯一可以明确地称之为将自动递归设置为默认值的缺点的是:假设任何人都在猜测该设置是否与任何特定存储库中的工作流匹配,并且出厂默认值必须是猜测值,那么猜测更昂贵的选项就更糟糕了。
为所有工作打开自动递归配置很容易,但如果你甚至不必这样做,你可能会浪费大量时间做克隆,你根本不知道这是不需要的。本地前端或引用库用于大型共享供应商历史是很容易的。
n8ghc7c14#
克隆或提取包含子模块的存储库时,默认情况下不会 checkout 子模块;你可以命令clone递归到子模块中,git submodule的init和update子命令会在工作树中保持子模块的 checkout 状态和相应的版本,或者你可以设置submodule.recurse使 checkout 递归到子模块中。
来源:git-scm.com
这个选项的缺点是克隆或拉取包含多个子模块的存储库会降低性能。
arknldoa5#
好吧,即使提交哈希值已经匹配,它似乎也会连接并获取子模块,这是不必要的。
除此之外应该没问题,因为所有内容都由提交固定。