git中submodule的用法解析

简介

为了方便项目的统一管理,paas平台采用的是pnpm的多包管理机制,目录结构如下client编辑器的sdk、demo编辑器的功能展示、servernest中间层。采用这种方式就会存在代码回滚和commit紊乱的痛点。

packages下的项目没有单独的进行commit的管理,导致我只想回滚client时会把demo和server的编写的代码也进行回滚。为了解决此问题引入了git submodule子模块的概念,来分别管理client和demo、server的commit记录,他们也依旧保留在主项目里,代码结构不变。 接下来就来讲解一下submodule的使用

用法

创建

首先我们现在git创建子项目git-submodule-1, 然后采用git submodule add git子仓库在主项目git-submodule引入这个子项目。同时会生成.gitmoudles文件记录子模块之间的映射

ts 复制代码
git submodule add https://github.com/AKclown/git-submodule-1.git

紧接着我们将主代码仓库push到远程仓库里

子模块的初始化

在上面我们通过git submodule add ~会同时把~仓库的代码clone下来,但是当其他用户在本地直接git clone 主仓库时是不会同步clone子仓库的代码的。 我在别的目录clone主仓库代码,可以看到子仓库的README.md并没有clone下来,如下两种方式来clone子仓库代码

方式一

csharp 复制代码
git submodule init  
git submodule update

通过如上两个命令就可以将子仓库的代码clone下来了。那么接下来就来分析一下上面两条命令的含义

  1. git submodule init是将.gitmodules的映射复制到./.git/config文件里 git submodule init ~ 还可以指定特定子模块,而不是全部
  2. git submodule update更新子模块代码到本地。git submodule update ~也可以指定对应的那个子模块

方式二

在克隆主仓库时,追加--recurse-submodules参数会把子仓库的代码一同clone下来

ts 复制代码
git clone git@github.com:AKclown/git-submodule.git --recurse-submodules

工作流

跟我们日常的git操作一样

在子仓库中

  1. 执行git pull origin main拉取代码
  2. git checkout -b ~创建功能分支
  3. git add/commit/push 提交代码 更新子模块1的readme文件,可以并且进行push可以看到在主仓库会生成两个文件git-submodule-1和git-submodule-2.这两个文件记录当前子仓库的最新commitId如下图所示 git-submodule-2更新了readme但还未提交,他的commitId会标记为dirty草稿的意思 Tips: 有了这两个文件辅助,我们在进行代码发布版本时,推送一次主仓库是不是就知道了此次version子仓库最新提交commitID

拉取子模块远程更新

  1. 拉取git-submodule-1仓库更新
bash 复制代码
cd git-submodule-1
git pull origin main
  1. 拉取所有子模块更新. foreach => 遍历
csharp 复制代码
> git submodule foreach 'git pull origin main'

删除子模块

有时候我们想要卸载子模块,可以通过如何命令git submodule deinit ~

ts 复制代码
git submodule deinit git-submodule-1

可以看出.gitmodules文件还存在子模块映射,以及packages目录下也还存在git-submodule-1代码文件。执行如下代码,即可清除它们

ts 复制代码
git rm git-submodule-1

当我们子模块代码有更新还未提交时,如果我们想强制删除子模块,只需要添加--force参数即可

ts 复制代码
git submodule deinit -f git-submodule-2

总结

通过上面的代码,我们学会了submodule的基础用法。在有使用到多包的场景也许能够更好的管理每个仓库的commit信息。最终仓库代码,子模块在主仓库以链接的形式展现

相关推荐
涛涛ing1 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员3 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice3 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
用户0829773260053 小时前
RTX 5500 MIG 踩坑记录:切分之后模型跑不起来,排错整整一下午
前端
Lank_M3 小时前
AI 放大后的图更清楚,但它不能当原图入库
前端
Swot3 小时前
SvelteKit 数据流研究:`+page.js` 和 `+page.server.js` 到底谁在跑,数据又去了哪儿
前端·后端
用户4147679304153 小时前
Windows 触摸屏上 Swiper 轮播滑不动?可能是内部滚动容器抢走了你的手势
前端
张明君644513 小时前
从一个 Referer 引发的 403,到 SSR 服务失稳:Astro 流式渲染与缓存失效分析
前端
律宏阔4 小时前
微信小程序 + Taro + TDesign 去掉 [&&&],让普通 Tailwind 类接管局部样式
前端·微信小程序·taro
费曼学习法4 小时前
把 3 个内部服务封装成 MCP Server 的工程复盘:进程模型、超时与错误契约
前端