今天的策略是让git子模块签出与commit-ID保持同步?

时间:2017-10-09 10:28:45

标签: git git-submodules git-pull git-checkout git-config

有人提出了很多关于自动更新子模块的问题 StackOverflow包括:

但在我看来,对于git子模块,还没有单一的方法,就像svn-externals一样有效svn up

因为git每天都在变化,我敢再问:

init 自动更新子模块检出(即与其对应的子模块提交ID保持同步){{1 } checkout(即pullmerge)?

目前我有两种方法:

#1:使用以下内容创建rebasepost-checkoutpost-merge摘要

post-rewrite

你已经可以看到这种方法有几个缺点:

  • 它的复杂,可能需要一个脚本才能使其正常运行
  • 如果已经使用这些git-hook ,则
  • 效果不佳
  • 提交挂钩仅在此克隆上有效(必须由...重新完成) 每个克隆人都在为这个项目工作)
  • 设置非标准,会让其他人感到困惑

#2:为#!/bin/sh git submodule update --init --recursive pull配置别名

checkout

但这并不好:

  • 它不会git config --global alias.up 'pull --recurse-submodules' git config --global alias.co 'checkout --recurse-submodules' 子模块(可以通过分别运行--init / pullcheckout来解决
  • 非标准,并且不会使用脚本和代码段
  • 容易忘记使用 submodule update / up而不是co / pull
  • 仅在本地计算机/用户

如果你能做某件事,这种方法会更像我希望它 像

checkout

..但你不能,是吗?

1 个答案:

答案 0 :(得分:1)

Git 2.13起,您可以执行git checkout --recurse-submodules <ref>,以确保活动子模块的工作树与超级项目中记录的子模块提交同步,该操作位于: <ref>

Git 2.14起,您可以执行git pull --recurse-submodules,这将执行常规拉动,然后调用git submodule update --init --recursive(如果您使用--rebase拉动,则将使用--rebase ),使活动子模块的工作树与超级项目中记录的子模块提交保持同步。

Git 2.15起,设置git config submodule.recurse true将使其成为接受--recurse-submodules标志的all commands的默认行为,但clonels-files除外

没有任何方法可以使此行为成为默认的,而无需更改配置或使用这些选项。


请注意,当当前分支没有子模块并且git checkout --recurse-submodules <branch>已初始化嵌套子模块时,在Git 2.27之前执行<branch>