git子模块跟踪最新

l.t*_*e.a 130 git git-submodules git-track

我们正在将我们(巨大的)项目转移到git,我们正在考虑使用子模块.我们的计划是在超级项目中有三个不同的头:发布,稳定,最新.项目负责人将处理释放和稳定的分支机构.他们将根据需要移动子模块.

问题是"最新"头.我们希望超级项目"最新"头部跟踪所有子模块的主分支(自动).如果能够显示子模块的所有提交历史,那也很棒.

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

Von*_*onC 220

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 
Run Code Online (Sandbox Code Playgroud)

如果您已经存在子模块,您现在希望跟踪分支,请参阅" 如何使现有子模块跟踪分支 ".

另请参阅Vogella关于子模块的教程,了解有关子模块的一般信息.

注意:

git submodule add -b . [URL to Git repo];
                    ^^^
Run Code Online (Sandbox Code Playgroud)

git submodule手册页:

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


请参阅提交b928922727d6691a3bdc28160f93f25712c565f6:

submodule add:如果--branch给出,请记录下来.gitmodules

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

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>
Run Code Online (Sandbox Code Playgroud)

减少到

$ git submodule add -b <branch> <repository> [<path>]
Run Code Online (Sandbox Code Playgroud)

这意味着未来的呼叫

$ git submodule update --remote ...
Run Code Online (Sandbox Code Playgroud)

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

签名:W.Trevor King


原始答案(2012年2月):

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

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

  • cd在子模块中
  • git fetch/pull以确保它在右分支上有最新的提交
  • 回到父回购中
  • 添加和提交以记录子模块的新提交.

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

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

其他替代方案在此详述.

  • 如何为已添加的子模块添加跟踪? (3认同)
  • @DC_我同意"这个答案"(因为我写了)."跟随分支"功能旨在将子模块更新为最新的分支提交.完成后,您仍然必须在父仓库中添加并提交新的子模块状态.下一个克隆将检查该状态(无头). (3认同)
  • @VonC所以为了进一步澄清,"跟随分支"功能只会通过告诉它更新子模块的哪个提交(即最新的master提交)来影响`git submodule update`命令的行为,而不是自动导致parent repo更新子模块在克隆时指向哪个提交? (3认同)
  • @BraveNewMath 您需要在子模块中签出正确的分支,然后转到您的父存储库并键入:`git config -f .gitmodules submodule.&lt;path&gt;.branch &lt;branch&gt;`。添加所有内容,提交并推送。 (2认同)
  • @BraveNewMath我在http://stackoverflow.com/a/18799234/6309中详细说明了使子模块跟踪分支的所有步骤. (2认同)
  • @DC_是的:每当子模块发生更改时,父模块仍然必须记录子模块的新状态(gitlink)。 (2认同)