Git Submodule 允许你将一个 Git 仓库(RepoA)作为另一个仓库(RepoB)的一个子目录,这样就是 RepoA 是 RepoB 的子模块,子模块本质上是一个指向仓库 RepoA 某个特定提交的指针或引用。
仓库 RepoA 和 RepoB 仍然是独立的项目,有独立的开发历史和权限管理。仓库 RepoB 只记录它引用了仓库 RepoA 的哪个提交,而不是代码本身。
假设你已经有了 RepoA 和 RepoB,现在想将 RepoA 添加为 RepoB 的子模块,在 RepoB 目录中打开终端执行:
git submodule add <URL_TO_REPO_A> libs/repo_a
请注意,在执行这条命令时,仓库 RepoB 的目录中不能存在 libs/repo_a
目录,你需要指定一个不存在的目录。
Git 会创建两个变化:
- 一个名为
.gitmodules
的配置文件(记录了子模块的路径和 URL)。 - 子模块目录本身
libs/repo_a
(但它是一个特殊的 git 目录,指向 B 的特定提交)。
你可以在仓库 RepoB 中添加并提交这两个变化:
git add .gitmodules libs/repo_a
git commit -m "feat: add repo_a as a submodule"
其他人使用仓库 RepoB 时:
# clone RepoB
git clone <URL_TO_REPO_B>
cd repo_b
# 更新子模块
git submodule update --init --recursive
如果仓库 RepoA 有了新的提交,你需要先在 libs/repo_a
目录下拉取更新,然后在仓库 RepoB 中提交这个新的引用。
# 进入子模块目录
cd libs/repo_a
git checkout main # 或 master, 或其他你需要的分支
git pull origin main
# 返回主项目根目录
cd ../..
git add libs/repo_a
git commit -m "chore: update submodule to latest commit"
其他人想要获取最新的仓库提交时:
# 在 RepoB 中
git pull
# 更新子模块
git submodule update