Menu
CoddyTech

Git Submodule

最后更新

子模块把一个 Git 仓库嵌入到另一个仓库中,并固定在某个特定提交上。父仓库会记录它依赖子模块的哪个提交,所以每个人拿到的都是同一个版本。当你想引入一个放在独立仓库里的共享库或组件、又不想复制它的代码时,就用子模块。

在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。

git 子模块把另一个仓库嵌入你的仓库,并固定在某一个确切的提交上。

语法

命令作用
git submodule add <url> libs/x把一个仓库作为子模块添加到 libs/x
git clone --recurse-submodules <url>克隆仓库及其子模块
git submodule update --init --recursive普通克隆之后初始化并获取子模块
git submodule update --remote把子模块更新到最新提交
git submodule status显示每个子模块所在的提交

常见用法

目标命令
克隆使用了子模块的项目git clone --recurse-submodules <url>
已经克隆之后再获取子模块git submodule update --init --recursive
把子模块升级到最新版本git submodule update --remote

git submodule 常见问题

git 子模块是什么?

子模块是嵌套在另一个 Git 仓库中、固定在某个提交上的 Git 仓库。父仓库存储的是指向那个提交的指针,而不是子模块的文件,所以协作者检出的都是同一个版本。它用于引入拥有独立仓库和历史的依赖或共享组件。

怎么克隆带子模块的仓库?
使用 git clone --recurse-submodules <url>,一步克隆父仓库及其所有子模块。如果克隆时没有加这个选项,之后运行 git submodule update --init --recursive 来填充子模块文件夹。
怎么把子模块更新到最新提交?
运行 git submodule update --remote,它会获取每个子模块所跟踪的分支,并移动到最新提交。然后在父仓库中提交这个变化,因为父仓库记录着它指向子模块的哪个提交:在你提交这个指针之前,更新并没有被保存。
为什么克隆后子模块文件夹是空的?
因为克隆时没有加 --recurse-submodules,Git 只创建了文件夹,没有获取其中的内容。运行 git submodule update --init --recursive 即可解决,它会初始化并下载所有子模块。
可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中运行 git submodule,无需安装。Coddy 的免费互动 Git 课程也会一步步教你搭建仓库。
Coddy 编程语言插图

在 Coddy 学习 Git

开始