【问题标题】:Git submodules on master主节点上的 Git 子模块
【发布时间】:2011-06-09 17:12:08
【问题描述】:

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

有没有办法让超级项目的子模块始终引用主分支的头部,所以超级项目中的“git submodule update”或“git pull”只是对所有子模块执行“git pull”。

谢谢。

【问题讨论】:

  • gitref.org Git 参考页面是 git 新手的好方法。
  • @Saher:这是一个非常具体的问题,而不仅仅是一般的“我是 git 新手”。
  • 我认为答案是否定的。 Git 在记录子模块的信息时存储提交名称,在我的例子中,我编写了一组脚本来拉、添加、提交和推送,这正是我希望它对子模块做的事情。
  • 子模块现在可以跟随分支(git1.8.2+)。见my edited answer below

标签: git git-submodules


【解决方案1】:

简短的回答是否定的。这个想法是您确定子模块的特定提交将适用于您的项目,并且您不希望通过获取即时更新而出现任何未定义或意外的行为。子模块直接由两件事表示:.gitmodules 中的条目和 gitlink,它是对子模块所需提交的 SHA1 的引用。 SHA1,不是引用名。

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

如果您想始终获取当前的 master 分支,最好自己动手。编写一个脚本来拉入所有子模块,然后不时运行它,提交更新的版本。 (不过先测试!)这里的重点是,对于子模块,对于每个超级项目提交,您必须确切知道您正在使用的子项目的版本。您可以选择多久更新一次子模块的版本;如果你愿意,它可以是每天。

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

【讨论】:

  • @Jefromi:也许你可以更新你的答案,因为它现在可以在 git 中使用?请参阅 VonC 的答案。
【解决方案2】:

2013 年更新,从 git 1.8.2 开始,子模块可以跟随分支(而不仅仅是引用固定提交)

见“git submodule tracking latest”。


(2011 年 1 月的原始答案)

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

子模块应该是一组具有不同生命周期的文件,您可以从中选择一个特定的提交,以便在您自己的项目(父 repo)上工作。
如果该子模块发布了新的提交,您不需要中断所有内容,因为突然间您的项目不再编译了,因为该子模块的最新演变。

另一方面,如果这两组文件密切相关,以至于修改一个文件中的任何内容都意味着更新另一个文件,那么它们确实应该是 *one repo 的一部分。

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 2015-02-21
    • 2016-11-20
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2021-01-31
    • 2017-10-05
    • 2010-12-04
    相关资源
    最近更新 更多