Git Submodule
最后更新
子模块把一个 Git 仓库嵌入到另一个仓库中,并固定在某个特定提交上。父仓库会记录它依赖子模块的哪个提交,所以每个人拿到的都是同一个版本。当你想引入一个放在独立仓库里的共享库或组件、又不想复制它的代码时,就用子模块。
在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。
语法
| 命令 | 作用 |
|---|---|
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 课程也会一步步教你搭建仓库。