简介
为了方便项目的统一管理,paas平台采用的是pnpm的多包管理机制,目录结构如下client
编辑器的sdk、demo
编辑器的功能展示、server
nest中间层。采用这种方式就会存在代码回滚和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
下来了。那么接下来就来分析一下上面两条命令的含义
git submodule init
是将.gitmodules
的映射复制到./.git/config
文件里git submodule init ~
还可以指定特定子模块,而不是全部git submodule update
更新子模块代码到本地。git submodule update ~
也可以指定对应的那个子模块
方式二
在克隆主仓库时,追加--recurse-submodules
参数会把子仓库的代码一同clone
下来
ts
git clone [email protected]:AKclown/git-submodule.git --recurse-submodules
工作流
跟我们日常的git操作一样
在子仓库中
- 执行
git pull origin main
拉取代码 git checkout -b ~
创建功能分支git add/commit/push
提交代码 更新子模块1
的readme
文件,可以并且进行push
可以看到在主仓库会生成两个文件git-submodule-1
和git-submodule-2
.这两个文件记录当前子仓库的最新commitId
如下图所示git-submodule-2
更新了readme
但还未提交,他的commitId
会标记为dirty
草稿的意思Tips: 有了这两个文件辅助,我们在进行代码发布版本时,推送一次主仓库是不是就知道了
此次version子仓库最新提交commitID
拉取子模块远程更新
- 拉取
git-submodule-1
仓库更新
bash
cd git-submodule-1
git pull origin main
- 拉取所有子模块更新.
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信息。最终仓库代码,子模块在主仓库以链接的形式展现