一、背景
在实际工作中,我们经常会遇到有些复杂的项目,根据功能拆分成很多子模块,或者同一个子模块在不同的项目中被依赖使用。
一旦子模块有更新,所有工程里的相关代码都要更新,重复工作而且可能出错。
为了解决这个问题,我们可以使用Git的submodule功能。
子模块( submodule )是一个内嵌在 git 仓库(父工程)中的 git 仓库。
通过子模块,可以将外部的仓库作为子目录放到自己的仓库中,既能方便的管理依赖,又可以保持依赖本身的独立性。
目的及原因:社区子服务在githup中是不同的项目,为了项目整体性以及使用jenkins 共享库部署项目方便,新增了主项目zhsq-master,把子服务集成在一起维护。
但是zhsq社区主干项目,使用版本多,维护性和维护日志的完整性,考虑使用该方案,集成到主项目中。
二、使用
主项目: zhsq-master
子模块项目: e-v1.0
在主项目zhsq-maste中添加子模块项目: e-v1.0,同时子项目有其独立的版本控制。
1.添加子模块
首先主项目clone到本地。
进入主项目zhsq-maste目录,使用以下命令创建一个子模块
此时项目仓库中会多出两个文件:
a. e-v1.0 : 子模块的文件夹
b. .gitmodules:保存子模块的相关信息
2.使用带有子模块的项目
后续使用者clone主项目后,子模块默认是空的,需要我们在项目根目录下执行如下命令完成子模块的下载
或者
3.修改别名
如本项目的子模块是e-v1.0,这个是不符合我们项目模块命名的,使用命令更改为zhsq
4.同步更新
子模块是不断在维护更新的,在主项目里,一般不建议去改动子模块。
子模块在分支更新,需要把代码合并到主干。方可。
子模块远程有更新,如果想保持本地子项目与远程仓库版本一致,就需要用以下命令更新子模块至远程仓库的最新版。
注意:命令 git submodule update 是更新主项目内子模块到最新版本,即与主项目远程仓库记录的子模块版本一致。
6. 删除子模块
a. 执行 git submodule deinit zhsq,自动在 .git/config 中删除了子模块相关信息。
这个命令如果添加上参数 --force,则子模块工作区内即使有本地的修改,也会被移除。
b. 执行 git rm zhsq,移除了 zhsq 文件夹,并自动在 .gitmodules 中相关信息。
此时,主项目中关于子模块的信息基本已经删除(可能.git/modules 目录下还有残余),但是不影响,继续commit,push,完成对子模块的删除。