今天如何保持Git子模块检出与提交ID同步的策略?

10

在StackOverflow上已经有很多关于自动更新子模块的问题,包括:

但就我所知,对于Git子模块,还没有像svn-externals一样完全适用的方法。

因此,由于Git每天都在变化,我敢再次问一下:

是否有一种(方便的)方法来初始化并自动更新子模块检出(即与相应的子模块提交ID保持同步)以进行checkoutpull(即mergerebase)?

目前,我有两种方法:

#1:创建具有以下内容的post-checkoutpost-mergepost-rewrite挂钩

#!/bin/sh
git submodule update --init --recursive

正如您已经看到的,这种方法有几个缺点:

  • 它很复杂,可能需要脚本才能可靠地运行
  • 如果您已经使用这些git-hooks,它不会很好地工作
  • 提交钩子仅在此克隆上活动(必须由在每个单独克隆上工作的每个人重新完成)
  • 设置是非标准的,会使其他人感到困惑

#2:为pullcheckout配置别名

git config --global alias.up 'pull --recurse-submodules'
git config --global alias.co 'checkout --recurse-submodules'

但这也不是很好:

  • 它不会--init子模块(可以通过分别运行pull/checkoutsubmodule update来解决)
  • 它是非标准的,并且无法与脚本和代码片段一起使用
  • 很容易忘记使用up/co而不是pull/checkout
  • 它仅在本地机器/用户上工作

如果您能做到以下操作,则此方法会更符合我的要求:

git config --global pull.recurseSubmodules true
git config --global pull.initSubmodules true
git config --global checkout.recurseSubmodules true
git config --global checkout.initSubmodules true

.. 但是你不能,对吗?

1个回答

2
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标志的命令默认采用这种行为,除了clonels-files命令。
没有办法在不更改配置或使用这些选项的情况下使此行为成为默认行为。
请注意,在当前分支没有子模块且 <branch> 已经初始化了嵌套的子模块的情况下,执行 git checkout --recurse-submodules <branch> 命令会在 Git 2.27 版本之前失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接