子模块移除是什么流程
完整移除一个子模块有固定顺序:先 deinit 清掉工作区内容,再 git rm 移除 gitlink 与 .gitmodules 条目,然后删除 .git/modules/<名字> 里的残留缓存,最后提交一次。只做一半是常见问题——漏删缓存后,再次添加同名子模块会沿用旧配置。
基本信息
| 第一步 | git submodule deinit -f <路径> 清工作区 |
|---|---|
| 第二步 | git rm -f <路径> 移除 gitlink 与 .gitmodules 条目 |
| 第三步 | 删除 .git/modules/<路径> 本地仓库缓存 |
| 第四步 | git commit 一次提交包含 gitlink 删除与 .gitmodules 修改 |
| 顺序要点 | deinit 在前、rm 在后;缓存清理不可逆,先确认已推送 |
典型使用场景
- 组件下线:不再需要的第三方或内部组件从仓库里彻底移除
- 迁移到包管理:子模块改成依赖工具拉取,仓库不再内嵌
- 目录合并:子模块内容并入主仓库后清理子模块记录
- 误加回滚:刚添加就发现搞错了,按同一流程移除干净
操作序列
操作序列
git submodule deinit -f vendor/common # 清工作区内容与本地配置
git rm -f vendor/common # 移除 gitlink 与 .gitmodules 条目
rm -rf .git/modules/vendor/common # 删除本地子模块仓库缓存
git commit -m 'chore: 移除 common 子模块' # 一次提交收尾
git status --short # 确认没有残留改动每步影响什么
| 步骤 | 影响对象 | 不做会怎样 |
|---|---|---|
| deinit | 工作区内容与本地配置 | 工作区残留旧文件 |
| git rm | .gitmodules 与索引中的 gitlink | 克隆者仍会看到子模块记录 |
| 删缓存 | .git/modules 下的本地仓库 | 再次添加同名子模块沿用旧配置 |
| commit | 版本历史 | 变更未记录,别人拉不到 |
删缓存目录不可逆:执行前确认子模块仓库已推送到远端或本地另有备份,尤其注意子模块里可能还有未推送的提交,不确定时先到子模块目录用 git log 看一眼。
提醒其他克隆过的人:本地残留的旧子模块缓存同样会在再次添加同名子模块时带出旧配置,让队友按相同顺序清理。