git使用子模块集成其它仓库到主仓库目录
1. 克隆主仓库时直接拉取子模块(首次拉取代码时,默认会拉取子模块,推荐)
# --recursive 递归拉取所有子模块
git clone --recursive git@gitcode.com:xxx/supo-admin.git2. 已克隆主仓库,后续同步子模块
# 初始化子模块(若未初始化)
git submodule init
# 拉取子模块代码并更新到最新版本
git submodule update --remote
3. 常用子模块维护命令
# 3-1. 更新子模块到远程最新版本
# 只更新 admin-web 子模块
git submodule update --remote admin-web
# 或更新所有子模块
git submodule update --remote
# 3-2. 进入子模块操作(如提交子模块代码)
# 进入子模块目录
cd admin-web
# 拉取子模块的远程更新
git pull origin 子模块分支名
git add .
git commit -m "fix: 子模块修复bug"
# 推送子模块的代码到远程
git push origin master
4. 移除子模块(如需删除)
# 4-1. 解除主仓库对子模块的跟踪
git submodule deinit -f admin-web
# 4-2. 删除子模块的本地目录
rm -rf admin-web
# 4-3. 删除主仓库中 .git 目录下的子模块配置
rm -rf .git/modules/admin-web
# 4-4. 从 .gitmodules 中删除该子模块的配置(或手动编辑 .gitmodules 删除对应段落)
git rm --cached admin-web
# 4-5. 提交删除操作
git commit -m "feat: 移除 admin-web 子模块"
git push5. 添加子模块
git submodule https://gitcode.com/xxx/merchant-web.git merchant-web恢复到项目 未执行 git submodule init 的状态,后续可再次拉子模块代码
要让 Git 子模块目录恢复到“未初始化/未拉取代码”的状态(和执行 git submodule init 前一致,仅保留子模块配置,删除本地代码),核心是 保留子模块的 Git 配置(.gitmodules 和 .git/config 中的记录),但删除子模块的本地代码目录和 Git 跟踪文件。以下是具体步骤:
核心逻辑
目标状态:
- 保留
.gitmodules文件(子模块配置记录); - 保留
.git/config中可能存在的子模块配置(可选,若之前执行过init); - 删除子模块的本地代码目录(如
submodule-dir/); - 删除 Git 对其子模块的跟踪文件(
.git/modules/[子模块名])。
具体操作步骤
假设你的子模块目录名为 submodule-dir(替换为实际子模块目录名):
1. 先确保子模块目录无未提交的修改(可选,避免数据丢失)
如果子模块目录中有自己的修改,先备份或提交(否则删除后会丢失):
# 进入子模块目录查看状态
cd submodule-dir
git status
# 若有未提交文件,可备份或提交(根据需求选择)2. 删除子模块的本地代码目录
直接删除子模块的物理目录(这是“看起来没拉取代码”的核心):
# 回到项目根目录
cd ..
# 删除子模块目录(本地代码全部删除)
rm -rf submodule-dir/3. 删除 Git 对其子模块的跟踪文件
Git 会将子模块的版本信息、配置等存储在 .git/modules/[子模块名] 目录中,必须删除才能彻底恢复到“未初始化”状态:
# 删除 Git 跟踪的子模块元数据(替换为实际子模块名)
rm -rf .git/modules/submodule-dir/4. (可选)保留子模块配置(关键!和 git submodule init 前一致)
如果想保留 .gitmodules 中的配置(后续可重新执行 git submodule init && git submodule update 拉取代码),无需删除 .gitmodules 文件。
若之前执行过 git submodule init,.git/config 中会有子模块的配置记录,若想完全恢复到“从未 init”的状态,可删除该记录:
# 取消 .git/config 中对子模块的配置(可选,不删也不影响“无代码”状态)
git config --unset-all submodule.submodule-dir最终效果验证
操作完成后,项目状态如下:
- 子模块目录
submodule-dir/不存在(或为空); .gitmodules文件保留(子模块配置还在);- 执行
git submodule status会显示类似-xxxxxx submodule-dir (未初始化)的提示(说明子模块未拉取代码); 后续若需重新拉取子模块,只需执行:
git submodule init # 初始化(读取 .gitmodules 配置) git submodule update # 拉取子模块代码
简化命令(一键操作,替换为实际子模块名)
# 替换 submodule-dir 为你的子模块目录名
SUBMODULE_NAME="submodule-dir" && rm -rf $SUBMODULE_NAME && rm -rf .git/modules/$SUBMODULE_NAME && git config --unset-all submodule.$SUBMODULE_NAME总结
通过“删除子模块目录 + 删除 Git 跟踪元数据”,即可让子模块恢复到“未拉取代码”的初始状态,和未执行 git submodule init/update 时完全一致,且保留了后续重新拉取的配置。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1391.html
转载时须注明出处及本声明