StackOverflow上有很多关于自动更新子模块的问题,包括。
但在我看来,对于git子模块来说,还没有一个单一的方法,可以像 svn up
关于svn-externals。
所以,既然git每天都在变化,我敢再问一次。
有没有一种(方便的)方法 启动 和 自动更新 的子模块签出(即与相应的子模块提交ID保持同步)。checkout
和 pull
(即 merge
和 rebase
)?
目前我有两种方法。
#1:创建一个 post-checkout
, post-merge
和 post-rewrite
钩子的内容如下
#!/bin/sh
git submodule update --init --recursive
正如你已经看到的,这种方法有几个缺点。
#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
......但你不能,是吗?
自 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
旗帜,除了 clone
和 ls-files
.
没有办法让这种行为成为默认的。橆 更改配置或使用这些选项。
请注意,做 git checkout --recurse-submodules <branch>
当当前分支没有子模块并且 <branch>
已初始化嵌套的子模块前失败。Git 2.27.