git submodules介绍
来自git官方的介绍
|
|
这个命令可以用于初始化、更新、检查子模块。
为什么需要
解决公共代码问题:
现在后端项目很多都是微服务,各个服务之间难免会有一些公共的方法(如时间处理、数据库连接等)。而如果每个服务都封装一下会特别繁琐且没必要。
git submodules
这个时候就可以大展身手了。
在当前项目中使用该命令可以引入一个子项目,引入的子项目和当前项目(父项目)提交互相独立。这样就实现了两个项目当独管理,并且子项目可以被多个父项目引用,保持代码封装性。
团队维护问题:
现在不排除有些公司的项目是基于大仓形式开发的,所有的代码都放在一个仓库内。假设现在多个模块在同时开发,并不能保证每个模块依赖的中间件或包版本是否一致,merge request的时候是否会有冲突。且还涉及到权限问题
而git submodules
就可以解决了。将每个模块作为子仓库来进行单独的版本管理,互相不影响。
实际上还有很多应用场景,比如我现在的博客是基于hugo
搭建的,有时会经常换主题,而我也不想关注主题的具体实现,则可以用到git submodules
将主题加入到我的博客仓库中,主题仓库和我的主仓库保持独立的提交。
常用命令
添加子仓库
|
|
该命令可以将某个仓库(git@xxx.git)加入到你当前的仓库中。
使用该仓库后,当前的仓库称为父仓库,加入的仓库称为子仓库。[path]代表具体加入到哪个路径中,如果不填则在父仓库中创建一个与子仓库同名的文件。同时在.gitmodules
文件中写入相关信息
举个例子:
在我的博客仓库中引入一个主题文件
|
|
.gitmodules
文件会新增子仓库信息:
|
|
同时子仓库的源码在themes/meme
可见了。
更新子仓库
子仓库如果更新,并且你也依赖最新的特性。那么可以在父仓库中拉取最新的依赖。
有两个方法,一个直接cd进入子仓库中,再git pull
对应的commit。和我们平时更新当个代码仓库一样
另外一种是在父仓库中运行命令:
|
|
最后一个仓库路径可选,如果不填,则更新所有的子仓库
删除子仓库依赖
没啥好说的,比如我上面举的例子。直接运行命令rm -rf themes/meme
,删除子仓库对应的路径即可。至于.gitmodules
文件内容,放着或者不删也行。这个文件是保存仓库父子关系的描述。
克隆仓库
我们在克隆一个仓库时,如果我们需要把对应的子仓库也拉取下来,则可以运行:
|
|
这样在拉取仓库时,也会把对应的子仓库拉取下来了。
如果已经普通的clone仓库也不怕,可以运行以下命令:
|
|
后面的参数相对路径也是可选的,如果不填则拉取全部的子仓库。
tips: 我们提交到远端的父仓库代码,并不会将整个子仓库代码都提交上去。只会保存当前父仓库依赖的子仓库的commit id