对于我们开发人员来说,Git的操作真的是再熟悉不过了,但是,我们真的利用好了Git了吗?或者,Git还给我提供了哪些更好功能,更丰富的功能帮助我们更好的管理代码,更好的完成项目的构建?
今天,我就来介绍一个对于团队十分有帮助的Git的功能——Git Submodule。
Submodule,直译过来就是子模块的意思,顾名思义就是控制子模块的意思。
其实在蒋鑫的《Git权威指南》当中,有比较详细的介绍:项目的版本库在某些情况虾需要引用其他版本库中的文件,例如公司积累了一套常用的函数库,被多个项目调用,显然这个函数库的代码不能直接放到某个项目的代码中,而是要独立为一个代码库,那么其他项目要调用公共函数库该如何处理呢?分别把公共函数库的文件拷贝到各自的项目中会造成冗余,丢弃了公共函数库的维护历史,这显然不是好的方法。
简单来说每个公司,随着业务的发展或者针对许多项目我们开发和抽取出一套甚至公用的代码库,可以被多个项目效用,而这个代码库不是放在一个项目当中,而且我们单独作为一个代码库来使用,同时定期维护这套公共的代码库。
但是对于其他的业务代码来说,他们该如何调用公用的代码库呢?难道是要一遍一遍的拷贝吗?这样不仅仅是操作麻烦,而且还丢弃了公共代码库的维护历史,甚至后期维护公共代码库的时候维护起来也十分的不便。其实Git早就帮我们解决了这一个问题,就是通过git submodule来解决!
首先我们需要两个版本库
从名称,我们就做了区分,一个是公共的版本库
https://github.com/yang0range/SubModuleDemoLib.git
另一个是引用公共版本库的主版本库
https://github.com/yang0range/SubModuleDemoMain.git
有了这两个版本库,我们就该介绍如何把两个版本库关联起来了
这里我们先介绍Git命令的使用,接下来,我会介绍TortoiseGit的使用。
可以看到,我们这两个项目都Clone成功了
用的命令是
git submodule add <repository> <path> //添加子模块
执行命令
git submodule add https://github.com/yang0range/SubModuleDemoLib.git SubModuleDemoLib
接下来,我们执行命令
cat .gitmodules
可以看到submodule添加成功了
同时我们可以看到目录下多了一个.gitmodules的文件
执行git cmmit命令 添加成功之后,再执行
git push指令
关于这两个我们最常用的指令,就不多介绍了。
之后我们查看git log就可以看到我们的提交记录了
以上就是完整的添加过程。
对于一个新成员来说,如果clone新代码也是尤为重要。 git为我们提供了两种克隆带有子模块版本库的方法
首先clone父项目,再初始化submodule,最后更新submodule。初始化只需要做一次,之后每次update就可以了。
git clone <main>
cd <main>
git submodule init
git submodule update
这种方法,较为繁琐Git又为我们提供了另外一个方法
git clone main --recursive
这里采用的是递归参数--recursive
对于子模块和主模块来说,两个库两个版本都是相对独立的,也就说对主模块来说,提交修改子模块不会对主模块造成任何影响。 修改和更新的时候也都是我们常用的指令
git add
git commit
git datus
git push
...
对于子模块的更新,Clone有两种方法,自然更新也有两种方法
先pull主模块,然后更新submodule
cd <main>
git pull
git submodule update
进入子模块,然后切换到对应的分支,然后对子模块独立的pull
cd <submodule>
git checkout master
cd..
git submodule foreach git pull
对于子模块来说,我们也会遇到移除,删除的操作
git rm <submodule>
git status
git commit -m "remove submodule"
git push origin master
TortoiseGit的好处自然不必多说了。那么TortoiseGit如何操作带有submodule的项目呢?
TortoiseGit已经为我们考虑了添加子模块的功能。
首先,我们Clone出主模块
Clone之后,我们发现,只是把子模块的目录Clone下来了,并没有内容!
别着急,通过Submodule Update就可以了
是不是很简单?
之前我也说过,对于主模块和子模块来说,两个是相对独立了,所以在执行命令的时候,单独对主模块,和子模块分别操作就可以了。
这些就是TortoiseGit的基本操作,随便网上一搜就能找到了。
https://blog.csdn.net/zahuopuboss/article/details/51472842 https://blog.csdn.net/wkyseo/article/details/81589477 https://blog.csdn.net/xuanwolanxue/article/details/80609986
相信,通过这篇文章,大家对于Git Submodule的使用有了一个全面的了解。