Git 子模块 (Submodule) 使用介绍

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 命令是无法把子仓库一起克隆下来的,这里有两种方法:

  1. 使用 --recursive 参数

clone 时添加 --recursive 参数,这样子模块也会一起克隆下来。

zsh 复制代码
git clone --recursive <仓库地址>
  1. 手动 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 <子模块名字> # 解除子模块与父仓库的关联
相关推荐
donecoding6 分钟前
Corepack 完全解析:从懵到懂,包管理器自由了
前端·node.js·前端工程化
yqcoder9 分钟前
端经典面试题:为什么 0.1 + 0.2 !== 0.3?
前端·css
ZC跨境爬虫14 分钟前
跟着 MDN 学 HTML day_12:(HTML网页图片嵌入)
前端·javascript·css·ui·html
光影少年20 分钟前
reeact虚拟DOM、Diff算法原理、key的作用与为什么不能用index
前端·react.js·掘金·金石计划
用户0595401744625 分钟前
大模型记忆存储踩坑实录:LangChain 的 ConversationBufferMemory 让我排查了 6 小时
前端·css
是上好佳佳佳呀32 分钟前
【前端(十二)】JavaScript 函数与对象笔记
前端·javascript·笔记
你真的快乐吗1 小时前
@fuxishi/svg-icon:一个 Vue 3 svg本地图标+iconify图标组件库,让图标管理不再头疼
前端·vue.js·typescript
Rkgua1 小时前
ESModule和Commonjs模块的区别
前端·javascript
江南十四行1 小时前
ReAct Agent 基本理论与项目实战(二)
前端·react.js·前端框架
用户600071819101 小时前
【翻译】React 如何乱序流式输出 UI,却仍保持最终顺序
前端