Git 子模块 (Submodule) 使用介绍
简介
子模块允许你将一个 git
仓库作为另一个 git
仓库的子目录。它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
比如,你想在一个项目中使用另一个项目,两个项目是分开维护的,隶属于两个 git
仓库,这个时候就可以用 git
的子模块功能。
添加子模块
首先,我们先初始化一个仓库:
zsh
git init
进入这个仓库,给这个仓库添加子模块:
zsh
git submodule add <子模块仓库地址> <子模块名字>
比如,我们执行 git submodule add https://github.com/CodingAndSleeping/vitepress-blog-main.git packages
此时,根目录就会多一个 packages
文件夹,里面包含了子模块的相关文件。
同时根目录生成一个 .gitmodules
文件,里面记录了子模块的相关信息:
zsh
[submodule "packages"]
path = packages
url = https://github.com/CodingAndSleeping/vitepress-blog-main.git
同时,会在 git
工作区生成一个特殊的文件,记录了子模块的 commit
指向,这个文件在文件夹中不会显示,在 vscode 的源代码管理面板中可以看到,需要把这个一起提交上去。
zsh
git add .
git commit -m "添加子模块"
clone 一个存在子模块的仓库
直接执行 clone
命令是无法把子仓库一起克隆下来的,这里有两种方法:
- 使用
--recursive
参数
在 clone
时添加 --recursive
参数,这样子模块也会一起克隆下来。
zsh
git clone --recursive <仓库地址>
- 手动 clone 子模块。
如果在 clone
时没有添加 --recursive
参数,那么子模块不会自动 clone 下来,需要手动 clone 子模块。
可以执行以下两个命令:
zsh
git submodule init # 注册子模块
git submodule update # 更新子模块
这两个命令还可以合并成一个命令:
zsh
git submodule update --init
更新子模块
如果子模块有更新,需要更新子模块。
可以通过在根目录执行 git submodule update
命令,来更新子模块:
zsh
git submodule update <子模块名字> # 更新指定子模块 不指定名字则更新所有子模块
子模块本质也是个 git 仓库,因此,也可以进入子模块目录,执行 git pull
命令,更新子模块
zsh
cd packages
git pull
注意,在更新之后,需要在主仓库把子模块的变更记录,也就是那个特殊的文件提交上去。
删除子模块
zsh
git rm <子模块名字> # 删除子模块
git deinit <子模块名字> # 解除子模块与父仓库的关联