Windows系统下如何自动上传Git子模块变更到主仓库?
Windows环境下自动暂存Git子模块变更的解决方案
默认执行git add *仅能暂存主仓库内变更、无法处理子模块内修改,是因为*是Shell层面的当前目录通配符,且Git默认不会递归进入子模块执行暂存操作,通过以下两种方案即可实现自动化处理,无需手动进入子模块目录操作:
原生Git命令方案(无需写脚本)
直接使用Git自带的递归处理参数即可完成全量暂存:
- 一键暂存主仓库+所有层级嵌套子模块的全部变更,直接执行:
git add --all --recurse-submodules
- 如果需要分步核对操作,也可以先遍历所有子模块暂存内部变更,再暂存主仓库的变更(含子模块指针更新):
git submodule foreach --recursive git add --all git add --all
执行后通过git status即可确认所有子模块的变更都已被正确暂存。
批处理脚本方案(一键执行)
如果需要封装成Windows下双击即可运行的工具,在主仓库根目录新建名为git-add-all.bat的文件,写入以下内容:
@echo off :: 递归暂存所有子模块内部变更 git submodule foreach --recursive "git add --all" :: 暂存主仓库所有变更(含子模块指针变动) git add --all :: 执行完成后输出当前仓库状态方便核对 git status echo. echo 所有变更(含子模块内容)已完成暂存 pause
后续需要暂存所有变更时直接双击运行该脚本即可。
配套提交、推送命令
暂存完成后如果需要直接提交、推送,也可以用递归参数避免重复手动操作:
- 递归提交所有变更:子模块内会先生成对应提交,再更新主仓库的子模块指针提交
git commit -m "你的提交说明" --recurse-submodules
- 安全推送:自动检查子模块未推送的提交,先推子模块再推主仓库,避免其他协作者拉取后找不到子模块对应提交报错
git push --recurse-submodules=on-demand
内容的提问来源于stack exchange,提问作者silver takana
相关产品推荐
相关产品推荐

