158

我们正在将我们的(巨大的)项目转移到 git 并且我们正在考虑使用子模块。我们的计划是在超级项目中有三个不同的负责人:

发布,稳定,最新

项目负责人将处理发布和稳定分支。他们将根据需要移动子模块。

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

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

4

1 回答 1

274

编辑(2020.12.28):自 2020 年 10 月以来,GitHub 将默认分支更改为主分支。请参阅https://github.com/github/renaming
下面的这个答案仍然反映旧的命名约定。


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手册页

一个特殊的值.用于表示子模块中的分支名称应该与当前存储库中的当前分支名称相同


请参阅提交 b928922727d6691a3bdc28160f93f25712c565f6

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

签字人:W. Trevor King

这使您可以在添加新子模块时轻松记录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 ...

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


原始答案(2012 年 2 月):

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

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

  • cd 在子模块中
  • git fetch/pull 以确保它在正确的分支上有最新的提交
  • cd 回到父仓库
  • add 和 commit 以记录子模块的新提交。

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

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

此处详细介绍了其他替代方案。

于 2012-02-08T08:24:48.820 回答