在StackOverflow上已经有很多关于自动更新子模块的问题,包括:
- 有没有一种方法可以让git pull自动更新子模块?
- 轻松拉取所有git子模块的最新版本
- 为什么
git checkout
不会自动执行git submodule update --recursive
?
但就我所知,对于Git子模块,还没有像svn-externals一样完全适用的方法。
因此,由于Git每天都在变化,我敢再次问一下:
是否有一种(方便的)方法来初始化并自动更新子模块检出(即与相应的子模块提交ID保持同步)以进行checkout
和pull
(即merge
和rebase
)?
目前,我有两种方法:
#1:创建具有以下内容的post-checkout
,post-merge
和post-rewrite
挂钩
#!/bin/sh
git submodule update --init --recursive
正如您已经看到的,这种方法有几个缺点:
- 它很复杂,可能需要脚本才能可靠地运行
- 如果您已经使用这些git-hooks,它不会很好地工作
- 提交钩子仅在此克隆上活动(必须由在每个单独克隆上工作的每个人重新完成)
- 设置是非标准的,会使其他人感到困惑
#2:为pull
和checkout
配置别名
git config --global alias.up 'pull --recurse-submodules'
git config --global alias.co 'checkout --recurse-submodules'
但这也不是很好:
- 它不会
--init
子模块(可以通过分别运行pull
/checkout
和submodule 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
.. 但是你不能,对吗?