主人的Git子模块

时间:2011-01-15 17:25:13

标签: git git-submodules

我是git子模块的新手,我注意到他们总是引用特定的提交。

超级项目的子模块是否有任何方法可以始终引用主分支的头部,因此超级项目中的“git submodule update”或“git pull”只对所有子模块执行“git pull”。

感谢。

2 个答案:

答案 0 :(得分:11)

简短的回答是否定的。我们的想法是,您确定子模块的特定提交将与您的项目一起使用,并且您不希望通过即时更新进入任何未定义或意外的行为。子模块直接由两个部分表示:.gitmodules中的一个条目和一个gitlink,它是对所需子模块提交的SHA1的引用。 SHA1,而不是refname。

你所要求的是超级项目真的不知道子模块中的内容。想一想:项目的不同克隆可以在不同的时间更新子模块,最后在那里使用不同的版本,然后如果在项目中进行了提交,他们必须在子模块中记录不同的提交。当你合并时,你可能只是忽略了他们所说的内容并且可能再次拉动。结果是你的请求避免了子模块的整个想法:知道你拥有什么。如果你说你正在使用“大师”,你会在两个月后回来并且不知道这意味着什么!

如果你想总是得到当前的主分支,你最好自己做。编写一个脚本来引入所有子模块,然后立即运行它,提交更新的版本。 (尽管先测试!)这里的要点是,对于子模块,对于每个超级项目提交,您必须确切知道您正在使用的子项目的版本。您可以选择更新子模块版本的频率;如果你愿意,它可以是每天。

另一种方法是将子模块的目录(ies)添加到你的gitignore,并编写一个快速的小脚本来更新它们(也可能是一个克隆它们的脚本)。这将使您有能力知道您在过去某个时间点的版本。

答案 1 :(得分:10)

2013年更新,因为git 1.8.2,子模块可以跟随分支(而不只是引用固定提交)

请参阅“git submodule tracking latest”。


(原始答案2011年1月)

这是 differences between git submodules and (for instance) svn:externals 之一。

子模块应该是一组具有不同生命周期的文件,您可以从中选择特定的提交以处理您自己的项目(父级仓库)。
如果该子模块发布新的提交,则不需要中断所有内容,因为由于所述子模块的最新演变,突然您的项目不再编译。

另一方面,如果两组文件密切相关,修改任何一个文件意味着更新另一个文件,那么它们应该真的是*一个回购的一部分。