git submodules

git submodules介绍

来自git官方的介绍

1
2
3
4
$ git help submodules

NAME
       git-submodule - Initialize, update or inspect submodules

这个命令可以用于初始化、更新、检查子模块。


为什么需要

解决公共代码问题:

现在后端项目很多都是微服务,各个服务之间难免会有一些公共的方法(如时间处理、数据库连接等)。而如果每个服务都封装一下会特别繁琐且没必要。

git submodules这个时候就可以大展身手了。

在当前项目中使用该命令可以引入一个子项目,引入的子项目和当前项目(父项目)提交互相独立。这样就实现了两个项目当独管理,并且子项目可以被多个父项目引用,保持代码封装性。

团队维护问题:

现在不排除有些公司的项目是基于大仓形式开发的,所有的代码都放在一个仓库内。假设现在多个模块在同时开发,并不能保证每个模块依赖的中间件或包版本是否一致,merge request的时候是否会有冲突。且还涉及到权限问题

git submodules就可以解决了。将每个模块作为子仓库来进行单独的版本管理,互相不影响。

实际上还有很多应用场景,比如我现在的博客是基于hugo搭建的,有时会经常换主题,而我也不想关注主题的具体实现,则可以用到git submodules将主题加入到我的博客仓库中,主题仓库和我的主仓库保持独立的提交。


常用命令

添加子仓库

1
git submodules add git@xxx.git [path]

该命令可以将某个仓库(git@xxx.git)加入到你当前的仓库中。

使用该仓库后,当前的仓库称为父仓库,加入的仓库称为子仓库。[path]代表具体加入到哪个路径中,如果不填则在父仓库中创建一个与子仓库同名的文件。同时在.gitmodules文件中写入相关信息

举个例子:

在我的博客仓库中引入一个主题文件

1
git submodule add https://github.com/reuixiy/hugo-theme-meme.git themes/meme

.gitmodules文件会新增子仓库信息:

1
2
3
[submodule "themes/meme"]
	path = themes/meme
	url = https://github.com/reuixiy/hugo-theme-meme.git

同时子仓库的源码在themes/meme可见了。

更新子仓库

子仓库如果更新,并且你也依赖最新的特性。那么可以在父仓库中拉取最新的依赖。

有两个方法,一个直接cd进入子仓库中,再git pull对应的commit。和我们平时更新当个代码仓库一样

另外一种是在父仓库中运行命令:

1
git submodules update --remote [submodule文件夹相对路径]

最后一个仓库路径可选,如果不填,则更新所有的子仓库

删除子仓库依赖

没啥好说的,比如我上面举的例子。直接运行命令rm -rf themes/meme,删除子仓库对应的路径即可。至于.gitmodules文件内容,放着或者不删也行。这个文件是保存仓库父子关系的描述。


克隆仓库

我们在克隆一个仓库时,如果我们需要把对应的子仓库也拉取下来,则可以运行:

1
git clone --recursive xxx.git

这样在拉取仓库时,也会把对应的子仓库拉取下来了。

如果已经普通的clone仓库也不怕,可以运行以下命令:

1
2
git submodule init [submodule的文件夹的相对路径]
git submodule update [submodule的文件夹的相对路径]

后面的参数相对路径也是可选的,如果不填则拉取全部的子仓库。

tips: 我们提交到远端的父仓库代码,并不会将整个子仓库代码都提交上去。只会保存当前父仓库依赖的子仓库的commit id

updatedupdated2023-05-132023-05-13