git-子仓操作

为什么

为什么要将代码仓作为子模块?有什么优势?

  1. 精确版本控制:父仓记录子仓的commit哈希值,确保代码版本固定,避免隐式升级导致的兼容性问题
  2. 模块化管理:将独立仓库作为子模块嵌入父仓,实现代码物理隔离,支持多团队写作与独立开发
  3. 代码复用与共享:同一模块可被多个项目引用,避免重复代码,确保一致性
  4. 权限与协作分离:子模块独立管理,父仓开发者无需介入子模块开发流程

父子仓项目结构

python 复制代码
主仓库:Project/
├── 子模块A  (通过submodule链接仓库)
├── 子模块B
└── 子模块C

相关操作

1. 添加子仓

bash 复制代码
git submodule add <repo> <Current_DIR Path>

添加以后,git会在父仓create两个文件:

  1. new file------> .gitmodules (保存子仓作为子模块所在的路径以及repo_url)

  2. new file -------> repo_file(子仓,由于是通过哈希值链接,所以是以file的形式存储而不是dir)

2. 更新子仓commit

在开发过程中,子仓会不断commit,所以父仓要随时或者定期的进行update submodule。

update 子仓commit:

bash 复制代码
git submodule update --remote <Current_DIR Path>

执行完上面操作后,本地submodule更新了,但是父仓remote尚未更新,所以需要单独push一下repo_file(保证父仓commit哈希与子仓最新commit一致):

bash 复制代码
git add <Current_DIR Path>

git commit -m "update submodule"

git push origin cc/appworld

3. 相同路径更换子仓

有时候我们可能需要在相同路径下更换不同的仓库作为submodule,该操作需要

删除:

  1. 该路径下submodule的git索引
  2. 彻底删除子模块的内部 Git 配置目录
  3. 删除物理文件

code options:

bash 复制代码
# 查看该submodule是否被git追踪
git ls-files | grep <submodule_path>
# 删除git索引
git rm --cache <submodule_path>
# 彻底删除子模块的配置信息 确保路径干净
rm -rf .git/modules/<submodule_path>
# 将新仓库作为子仓链接 (忽略冲突)
git submodule add -f <new_repo_url> <submodule_path> 

补充:

-->git的索引是暂存区,记录了哪些文件需要被提交到仓库,--cache选项表示从索引中移除该文件不再追踪,但是物理文件还是在的,所以需要手动删除一下物理文件然后重新submodule add

--> git子模块本质是一个嵌套的git仓库,其配置和对象都存储在.git/modules/<submodule_path>,rm -rf会强制递归删除路径下所有内容。相当于彻底清除子模块与git的联系。

--> git submodule add -f 中 -f是强制重新添加,避免忘记删除物理文件导致的existing error(忽略冲突)

还有一个更为便捷的方法,直接更新子模块的url:

bash 复制代码
git submodule set-url <path>  <new-url>

该操作仅仅更新仓库url并不会将原有仓库的文件进行更替或者删除

4. 子模块中包含其他子模块

如果你需要添加的子仓中也潜逃了子仓,那么需要执行下面命令进行添加

bash 复制代码
# 初始化并更新嵌套子模块
git submodule update --init --recursive

# 克隆主仓库时自动初始化嵌套子模块
git clone --recurse-submodules --recursive <main-repo-url>
相关推荐
vibecoding日记2 天前
为什么我就想要「线性历史 + Signed Commits」,GitHub 却把我当猴耍 🤬🎙️
git·编程工具
程序员小崔日记3 天前
如何将代码轻松上传到 Gitee?Git 使用全攻略!
git·gitee·上传
Bigger4 天前
为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南
git·开源·github
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
红豆子不相思5 天前
Tomcat 环境搭建与集群实战
服务器·git·tomcat
杰哥技术分享5 天前
Git 仓库迁移技术文档:从 CODING.net 迁移至腾讯云 CNB
git
梅孔立5 天前
Ansible 100 台服务器一键管控实战 进阶版
服务器·git·ansible
qq_426003965 天前
git切换当前分支到远程分支
git
ON10N5 天前
100% 纯 Vibe Coding,我是怎么用 AI 撸出一个 VS Code 插件的
git·ai编程·visual studio code