git submodule foreach 是什么
对每个子模块执行同一条命令:批量拉取、查看状态、统一切换分支都用它。执行环境中提供 $name、$path、$sha1 等变量,便于对每个子模块生成不同参数。
基本信息
| 语法 | git submodule foreach '<命令>' |
|---|---|
| 变量 | $name 子模块名、$path 相对路径、$sha1 记录的提交 |
| 递归 | --recursive 逐层执行 |
| 失败行为 | 某个子模块命令失败会中止后续执行 |
| 适用 | 多子模块仓库的批量维护 |
| 环境变量 | $toplevel 指向父仓库根目录,便于拼日志路径 |
| 示例输出 | 每个子模块执行前打印 Entering '路径' 便于定位 |
典型使用场景
- 批量拉取:对所有子模块执行 fetch,保持本地引用新。
- 状态巡检:逐个子模块跑 status --short,快速找脏目录。
- 统一分支:把全部子模块切到同名分支(实验性仓库梳理)。
- 版本核对:输出每个子模块当前 HEAD 对照父仓库记录。
- 清理操作:批量执行清理命令回收空间。
- CI 脚本:检出后按需批量初始化或验证子模块。
- 依赖安装:在各子模块目录内跑同一条装依赖命令。
- 钩子同步:批量更新子模块里的脚本或配置(属写操作,谨慎)。
常用示例
常用示例
git submodule foreach 'git status --short' # 巡检:哪些子模块有改动
git submodule foreach --recursive 'git fetch --all --prune' # 批量拉取含嵌套
git submodule foreach 'echo $name: $(git rev-parse HEAD)' # 输出各子模块当前提交
git submodule foreach 'git switch main' # 统一切换分支(实验场景)可用变量一览
| 变量 | 含义 | 用途 |
|---|---|---|
| $name | 子模块名称 | 输出标识与条件分支 |
| $path | 相对父仓库的路径 | 文件操作定位 |
| $sha1 | 父仓库记录的提交 | 对账与校验 |
| $displaypath | 展示用路径 | 日志输出 |
命令会在每个子模块目录执行,写错的分支操作可能影响全部子模块;先在副本上验证,批量写操作前先跑只读版本(如 status)确认范围。;把常用批量命令封装成脚本并注明副作用。