Git:在所有子模块上递归切换分支(签出)

y2k*_*ham 7 git git-submodules git-alias

我正在开发一个包含submodules. 我在所有子模块(包括父模块)中都有同名的分支(例如masterdevelopment..),并且它们都跟踪相应的远程分支。

我想一次在所有子模块中签出相同的分支。换句话说,我想要的是,如果我切换到development父模块中的分支,所有子模块也应该切换到development分支,以便我的工作树与分支保持一致。

手动执行此操作既痛苦又重复。有捷径吗?

小智 5

您可以使用该--recurse-submodule标志。例如:git checkout master --recurse-submodules

使用 --recurse-submodules 将根据超级项目中记录的提交更新所有初始化子模块的内容。[ https://git-scm.com/docs/git-checkout#git-checkout---no-recurse-submodules]


y2k*_*ham 4

git-alias我在和 的帮助下实现了这一点bash script

以下是我的名为 git-rcheckout.sh 的 bash 脚本,取自@qbein 的答案

#!/bin/bash
((!$#)) && echo No branch name, command ignored! && exit 1
git checkout $1 && git submodule foreach --recursive git checkout $1
Run Code Online (Sandbox Code Playgroud)

接下来,我将此脚本别名为 rcheckout 命令,如@u0b34a0f6ae 所说

git config --global alias.rcheckout '!sh ~/path/to/script/git-rcheckout.sh'
Run Code Online (Sandbox Code Playgroud)

问题:目前它仅在您git rcheckout branch-name从父模块执行时才有效。您也可以更新 bash 脚本以从子模块执行此操作,但我太懒了。所以欢迎提出建议。