git submodule status
git -C vendor/sdk fetch origin
git -C vendor/sdk checkout 8c1d4f2
git add vendor/sdk && git commit -m 'bump sdk to 8c1d4f2'

git submodule update 之后子模块目录能编译,主仓库 git status 却是干净的,跑起来还是上周的接口签名。git submodule status 每行前面带一个减号。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,子模块更新只把工作区切到主仓库记录的提交,不会自动跟到远端最新。子模块本身处于 detached HEAD,里面 checkout 的新提交没有被主仓库记录,父仓库指针自然不动。

「submodule 指针」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:git submodule status 看行首符号 减号是没初始化 加号是和记录不一致;进子模块 git fetch 后 checkout 需要的提交;回主仓库 git add 子模块目录 把新指针写进暂存区;提交主仓库并推送 否则别人拉到的还是旧指针;CI 用 git submodule update --init --recursive 固定拉取。

改完只确认一件事:git submodule status 行首没有加号和减号 父仓库提交里指针指向新哈希。

作者 9823189