首页/开发/Git 与协作速查/完整移除一个子模块
进阶与大仓实践69 条

完整移除一个子模块

顺序:deinit 清工作区 → git rm 移除 gitlink 与 .gitmodules 条目 → 删除 .git/modules/<name> 残留缓存 → 提交变更。

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

子模块移除是什么流程

完整移除一个子模块有固定顺序:先 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 看一眼。
提醒其他克隆过的人:本地残留的旧子模块缓存同样会在再次添加同名子模块时带出旧配置,让队友按相同顺序清理。

易错点

  • 漏删 .git/modules 缓存:再次 git submodule add 同名子模块时沿用旧 URL 与旧配置,问题隐蔽且难查,清理后先试添加一次再正式使用
  • 子模块里有未推送提交:删缓存等于丢弃那些提交,删前先在子模块里 git log 核对
  • 顺序颠倒先 rm 后 deinit:工作区还占着目录,容易报错或留下半清理状态
  • 提交拆成多次:gitlink 删除与 .gitmodules 修改分开提交会留下不可克隆的中间态,两部分变更要在同一次提交里完成

数据来源与参考

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