什么是git submodule
简单说,就是在项目A中引用了git项目B,此时项目B即为项目A的子模块,而它们这种关系的建立需要使用到git submodule add命令来完成,另外,项目A除了引用项目B还可以引用项目C,D,E。。。具体依场景及需求而定
特点
1、主项目和子模块都是完整的git仓库
2、主项目可以只使用子模块而不作改动
3、若有需要,也可以修改子模块并提交代码
主项目和子模块的关系存在哪里以及怎么维护?
主项目和子模块的关系仅存在主项目,子模块是不会有感知的,也就是说它并不清楚有没有被人使用以及都被谁使用,而维护这份关系的文件为:.gitmodules,这份文件会维护当前主项目下所有的子模块,如:
子模块的使用
一、如何添加子模块?
1、在主项目根目录添加子模块(与仓库同名):
git submodule add [子模块git地址],如:git submodule add https://git.kilikili.com/frontend/com-module.git
2、在主项目中指定目录添加子模块(名称可自定义)
git submodule add [子模块git地址] [指定目录],如:git submodule add https://git.kilikili.com/frontend/com-module.git src/submodule/com-module
说明:当我们执行git submodule add命令时,会自动将子模块的项目代码克隆到当前项目某个目录下(默认是项目根目,具体看上面2种执行方式而定)
二、克隆含有子模块的项目时,默认子模块目录下为空,那么如何拉取子模块?
1、git clone时,如何拉取所有子模块? 加上--recurse-submodules,如:
git clone --recurse-submodules [主项目git地址]
执行上述命令后,可以看到,git先会拉取主项目,然后再拉取子模块
2、git clone后,如何拉取某个子模块?
在主项目根目录依次执行如下命令即可:
git submodule init [submodule的文件夹的相对路径],如:git submodule init src/submodule/vip-service
git submodule update [submodule的文件夹的相对路径],如:git submodule update src/submodule/vip-service
说明:上面两条命令可简写为:
git submodule update --init [submodule的文件夹的相对路径]
如果不想指定子模块目录,也可以直接进入到子模块所在目录,如,cd src/submodule/vip-service,然后依次执行如下命令:
git submodule init
git submodule update
3、git clone后,如何拉取所有子模块?
在主项目根目录依次执行如下命令即可:
git submodule init
git submodule update
说明:上面两条命令可简写为:
git submodule update --init
如果还要初始化、抓取并检出任何嵌套的子模块, 可使用更简明的:
git submodule update --init --recursive
三、获取子模块的远程更新并与本地完成合并:
进入子模块目录,并执行:
git fetch
git merge origin/master
如果你不想在子目录中手动抓取与合并,那么可以执行如下命令,Git将会进入子模块然后完成抓取并更新。
git submodule update --remote
四、子模块的遍历:
git submodule有一个 foreach 子模块命令,它能在每一个子模块中运行任意命令。 如果项目中包含了大量子模块,将会非常有用:
例如,假设我们想要开始开发一项新功能或者修复一些错误,并且需要在几个子模块内工作。 我们可以轻松地保存所有子模块的工作进度。
git submodule foreach 'git stash'
然后我们可以创建一个新分支,并将所有子模块都切换过去。
git submodule foreach 'git checkout -b featureA'
同样,生成一个主项目与所有子项目的改动的统一差异也是非常有用的
git diff; git submodule foreach 'git diff'
五、子模块的别名:
有可能我们想为其中一些命令设置别名,但它们可能会非常长,而我们又不能设置选项作为它们的默认选项。 如果我们计划在 Git 中大量使用子模块的话,有些例子:
$ git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'"
$ git config alias.spush 'push --recurse-submodules=on-demand'
$ git config alias.supdate 'submodule update --remote --merge'
六、参考资料: git子模块