如何批量为Git子模块从对应默认分支(main/master)拉取代码
Git子模块混合默认分支拉取方案
场景说明
Git仓库包含多个子模块时,常出现部分子模块默认分支为main、其余子模块默认分支为master的混合情况。当所有子模块默认分支统一时,直接执行以下任意一条命令即可正常拉取代码:
git submodule foreach git pull origin master
git submodule foreach git pull origin main
但在混合分支场景下,硬编码指定单一分支名会让默认分支不匹配的子模块抛出分支不存在的报错,无法一次性完成所有子模块的代码拉取。
方案1:单命令直接适配(无需提前配置)
直接在仓库根目录执行以下命令,会自动识别每个子模块的远程默认分支完成拉取,兼容main/master/其他自定义默认分支的混合场景:
git submodule foreach --recursive 'git pull origin $(git remote show origin | awk -F": " "/HEAD branch/ {print \$2}")'
命令逻辑说明:
--recursive为可选参数,添加后会同时遍历所有嵌套的多级子模块,没有嵌套子模块时可去掉该参数- 遍历每个子模块时,会先查询origin远程仓库的HEAD指向的默认分支名,再将查询到的分支名传入pull命令执行拉取,不会出现分支不存在的报错
方案2:Git原生标准更新方式(推荐长期使用)
Git本身提供了专门的子模块远程更新命令,不需要手动写分支识别逻辑:
git submodule update --remote --merge
该命令会自动读取每个子模块配置的跟踪分支,拉取对应分支的最新代码并合并到本地。
如果是首次使用,先执行一次配置命令,让所有子模块自动绑定自身的远程默认分支即可,后续每次拉取直接跑上面的update命令就行:
git submodule foreach 'git config -f $toplevel/.gitmodules submodule.$name.branch $(git remote show origin | awk -F": " "/HEAD branch/ {print \$2}")'
注意:子模块拉取更新后,主仓库会记录子模块新的commit指针,若需要保留更新后的子模块版本,记得提交主仓库的子模块指针变更。
内容的提问来源于stack exchange,提问作者Atsushi Sakai
相关产品推荐
相关产品推荐

