git子模块跟踪最新


136

我们正在将(巨大的)项目移至git,并且正在考虑使用子模块。我们的计划是在超级项目中拥有三个不同的负责人:release,stable,latest。项目负责人将负责发布和稳定分支。他们将根据需要移动子模块。

问题是“最新的”头。我们希望超级项目的“最新”头(自动)跟踪所有子模块的主分支。而且,如果它将显示对子模块的所有提交的历史记录,那也很好。

我看过gitslave,但这并不是我们想要的。有什么建议?


当你问一个工具,我只是想接这个问题,它收集的俏皮话做同样的事情:stackoverflow.com/questions/1030169/...
东武

Git现在提供使用子模块跟踪最新消息:请参阅我编辑过的答案。
VonC

Answers:


235

2013年3月更新

Git 1.8.2增加了跟踪分支的可能性。

git submodule”开始学习一种与远程分支的尖端集成的新模式(与集成在超级项目的gitlink中记录的提交相反)。

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

如果您已有子模块现在希望跟踪一个分支,请参阅“ 如何使现有子模块跟踪一个分支 ”。

另请参阅Vogella的子模块教程,以获取有关子模块的常规信息。

注意:

git submodule add -b . [URL to Git repo];
                    ^^^

参见git submodule手册页

特殊值.用来指示子模块中分支的名称应与当前存储库中的当前分支的名称相同


参见commit b928922727d6691a3bdc28160f93f25712c565f6

submodule add:如果--branch给出,将其记录在.gitmodules

这样,您submodule.<name>.branch可以在.gitmodules添加新的子模块时轻松记录选项。有了这个补丁,

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

减少到

$ git submodule add -b <branch> <repository> [<path>]

这意味着将来需要

$ git submodule update --remote ...

将从您用于初始化子模块的同一分支(通常是您想要的)中获取更新。

签字人:W. Trevor King


原始答案(2012年2月):

子模块是父存储库引用的单个提交。
由于它本身就是一个Git仓库,因此可以通过git log该子模块中的“所有提交的历史记录”进行访问。

因此,为了使父级自动跟踪子模块的给定分支的最新提交,它需要:

  • 子模块中的cd
  • git fetch / pull以确保它在正确的分支上具有最新的提交
  • cd返回上级仓库
  • 添加并提交,以记录子模块的新提交。

gitslave(您已经看过)似乎是最合适的,包括commit操作

由于需要签出到正确的子模块分支,进行更改,提交,然后进入超级项目并提交提交(或至少记录新的位置),因此对子模块进行更改有点烦人。子模块)。

其他替代方法在此处详细说明


1
@BraveNewMath您需要在子模块中检出正确的分支,然后转到父仓库并输入:git config -f .gitmodules submodule.<path>.branch <branch>。添加所有内容,提交并推送。
VonC

2
@BraveNewMath我在stackoverflow.com/a/18799234/6309中详细说明了使子模块跟踪分支的所有步骤。
VonC

1
--remote如果您不希望在更新时变得头昏眼花,请使用该标签,这很重要,想知道为什么似乎您刚提取的代码在master后面!
克里斯·瓦茨

3
@DC_我同意“这个答案”(因为我写了它)。“跟随分支”功能旨在将子模块更新为分支的最新提交。完成后,您仍然必须在父存储库中添加并提交新的子模块状态。下一个克隆将检出该状态(无头)。
VonC

3
@VonC因此,为了进一步澄清,“跟随分支”功能仅git submodule update通过告诉命令哪个子提交(即主节点上的最新提交)来更新子模块,从而影响命令的行为,而不会自动地导致父仓库更新哪个子模块。克隆时子模块指向了commit?
christner'7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.