Git中同时使用跟踪与非跟踪子模块的正确更新方法
解决混合子模块的批量更新问题
针对你同时存在非跟踪子模块(固定哈希)和跟踪分支子模块(绑定远程分支)的场景,这里有个无需手动指定子模块的自动更新方案:
核心思路
只筛选出配置了跟踪分支的子模块进行--remote更新,完全保留非跟踪子模块的固定哈希。
一键执行命令
直接在父仓库根目录运行这条命令:
git config --file .gitmodules --get-regexp '^submodule\..+\.branch$' | awk -F'[ .]' '{print $2}' | xargs -I {} git submodule update --remote {}
命令拆解
git config --file .gitmodules --get-regexp '^submodule\..+\.branch$':从.gitmodules配置文件中提取所有设置了branch属性的子模块(也就是你添加时用-b指定分支的跟踪子模块)awk -F'[ .]' '{print $2}':解析输出,提取子模块的路径/名称xargs -I {} git submodule update --remote {}:对每个找到的跟踪子模块,执行远程更新操作
进阶:做成Git别名(可选)
如果需要频繁执行,把命令封装成Git别名更方便:
- 打开全局Git配置文件(
~/.gitconfig)或者当前仓库的.git/config - 添加以下内容:
[alias] submodule-update-tracked = !git config --file .gitmodules --get-regexp '^submodule\\..+\\.branch$' | awk -F'[ .]' '{print $2}' | xargs -I {} git submodule update --remote {}
之后只需运行git submodule-update-tracked就能完成自动更新。
注意事项
更新完跟踪子模块后,如果要把这些子模块的最新哈希同步到父仓库,记得执行:
git add <跟踪子模块路径> git commit -m "更新跟踪子模块到远程最新"
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

