子模块初始化与更新
克隆后子模块目录默认是空的:初始化负责登记配置,更新负责按父仓库记录的提交检出内容。日常同步只需要更新这一步,需要跟进子模块远端分支时才用其他选项,两者都支持递归处理嵌套子模块。
基本信息
| 初始化 | git submodule init 把子模块配置写入本地设置 |
|---|---|
| 检出内容 | git submodule update 检出父仓库记录的提交 |
| 一步到位 | git submodule update --init --recursive |
| 并行加速 | --jobs 4 并行拉取多个子模块 |
| 状态检查 | git submodule status --recursive 查看各子模块当前提交 |
典型使用场景
- 克隆后构建报缺文件,先完成初始化与更新
- 流水线在构建前需要拉取子模块内容
- 切换分支后子模块指针变化,需要同步检出
- 嵌套子模块需要递归处理
- 排查子模块为何停在旧提交上
常用示例
常用示例
git submodule update --init --recursive # 初始化并检出全部子模块
git submodule update --init --recursive --jobs 4 # 并行拉取加速
git submodule status --recursive # 查看当前提交,行首减号表示未初始化
git submodule update --remote # 跟进子模块远端分支,谨慎使用
git submodule foreach 'git status -s' # 对每个子模块批量查看状态状态前缀读法
| 行首标记 | 含义 |
|---|---|
| 无标记 | 已检出,版本与父仓库记录一致 |
| 减号 | 尚未初始化,目录为空 |
| 加号 | 检出的提交与父仓库记录不同 |
| 字母 U | 子模块内部存在未合并的冲突 |
日常同步只需执行更新;要跟进子模块远端分支时再用对应选项,并注意这会让父仓库记录的指针发生变化。
更新后子模块处于游离状态,直接在里面提交容易丢在游离指针上,改代码前先切出一个分支。
持续集成里应在构建前一步完成子模块初始化与更新,失败时把状态输出打印出来,能快速区分是网络问题还是指针不一致。
多个子模块并行拉取能明显缩短等待时间,但并行度设得过高会挤占带宽,反而拖慢整体进度。