首页/开发/Git 与协作速查/子模块的初始化与更新
进阶与大仓实践69 条

子模块的初始化与更新

克隆后子模块目录默认是空的:git submodule init 登记配置,git submodule update 检出父仓库记录的提交;也可一步 --init --recursive。

Git 与协作速查开发更新于 2026-10-13

子模块初始化与更新

克隆后子模块目录默认是空的:初始化负责登记配置,更新负责按父仓库记录的提交检出内容。日常同步只需要更新这一步,需要跟进子模块远端分支时才用其他选项,两者都支持递归处理嵌套子模块。

基本信息

初始化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子模块内部存在未合并的冲突
日常同步只需执行更新;要跟进子模块远端分支时再用对应选项,并注意这会让父仓库记录的指针发生变化。
更新后子模块处于游离状态,直接在里面提交容易丢在游离指针上,改代码前先切出一个分支。
持续集成里应在构建前一步完成子模块初始化与更新,失败时把状态输出打印出来,能快速区分是网络问题还是指针不一致。
多个子模块并行拉取能明显缩短等待时间,但并行度设得过高会挤占带宽,反而拖慢整体进度。

易错点

  • 忘记递归选项时嵌套子模块目录为空,构建以缺文件报错且不易定位
  • 更新后发现子模块处于游离指针,直接在里提交造成工作丢失
  • 在子模块里改了代码却没在父仓库更新指针,别人克隆后依然拿到旧内容
  • 父子仓库同时处于中间状态时切换分支,两边版本对不上,构建结果难以复现

数据来源与参考

  • Git 官方文档:git-submodule(init/update)
  • Pro Git 2nd Edition · 7.11 子模块
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌