首页/开发/Git 与协作速查/git submodule status 查看子模块状态
进阶与大仓实践69 条

git submodule status 查看子模块状态

输出每个子模块当前提交与父仓库记录的差异:前缀 - 表示未初始化、+ 表示提交不一致、U 表示合并冲突,是排查子模块问题的常用入口。

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

git submodule status 是什么

查看每个子模块当前检出的提交与父仓库索引里记录的指针是否一致:输出行首的一个字符就是差异类型,后面依次是提交哈希、路径与描述。父仓库对子模块只记录提交指针而不是分支,所以「目录里的代码」与「父仓库记录的代码」随时可能不一致,status 就是检查这种偏差的第一入口,提交前自检与 CI 检出后核对都靠它。

基本信息

语法git submodule status [--cached] [--recursive]
标记空格=一致;-=未初始化;+=检出与记录不同;U=子模块内有合并冲突
--cached只看父仓库索引里记录的指针,不读工作区状态
摘要git submodule summary 列出子模块内相对记录的提交变化
适用任何含子模块的 Git 仓库;CI 检出目录同样适用

典型使用场景

  • 提交父仓库前自检:确认所有子模块指针都停在预期提交,避免把本地实验状态提交进去。
  • 构建疑似用了旧代码时定位:+ 说明目录里检出的提交与记录不同,先查这个再查构建脚本。
  • CI 检出后核对:跑 status --recursive 确认所有层级子模块都按指针拉齐,再开始构建。
  • 合并冲突后检查:U 表示子模块内部有冲突,需要进子模块目录解决后重新记录指针。
  • 发布核对:对照发布 tag 逐一检查子模块指针与发布记录一致,防止漏更新。

常用示例

常用示例
git submodule status               # 每个子模块一行:标记+提交+路径
git submodule status --cached      # 只看父仓库索引里记录的指针
git submodule status --recursive   # 连嵌套子模块一起查看
git submodule summary              # 列出子模块内相对记录的提交变化
git submodule update --init --recursive   # 按记录把工作区拉齐

输出首字符读法

首字符含义处理办法
空格检出提交与父仓库记录一致无需操作
-子模块尚未初始化,目录为空git submodule update --init 拉取
+检出的提交与记录不同(本地改了或记录旧了)想清楚以哪边为准:update 或记录新指针
U子模块内部存在合并冲突进子模块目录解决冲突并提交
提交父仓库前用它做最后核对:出现 + 时先问自己「是本地改动了,还是父仓库记录旧了」,两个答案的处理方式正好相反;确认后要么提交新指针,要么 update 回记录版本。

易错点

  • 带 + 前缀说明检出提交与父仓库记录不一致:误提交会把未经评审的子模块改动带进主干,提交前务必想清楚要不要更新指针。
  • 子模块目录被手工改造成普通目录(删掉 .git 再重新 add)后 status 输出会异常,需要重新 init 恢复链接关系。
  • 嵌套子模块不加 --recursive 会漏掉第二层的问题,CI 自检脚本里默认带上它。
  • 不先看 status 就执行 submodule update --remote,指针会被拉到远端最新而不是记录版本,与预期背道而驰。
  • 把 status 输出当作 CI 断言时,要显式让非空异常标记导致流水线失败,否则会出现「构建通过但内容错误」的假绿灯。

数据来源与参考

  • Git 官方文档:git-submodule(status/summary)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌