前言
git对多模块的操作需要使用下面的命令
git submodule foreach
只需要在后面加上需要进行的操作,就会逐模块执行。比如:
git submodule foreach git stash
就会遍历所有子模块并把子模块储存起来。
打tag
因为 git submodule foreach只会对子模块而不会对主仓库操作,所以如果向对所有仓库都打上相同的tag就需要单独对主仓库打tag。
git tag tag_test
然后对子模块打tag,输入命令
git submodule foreach git tag tag_test
就会逐模块的打上tag_test,输入以下命令查看:
git submodule foreach git tag
结果:
Entering 'XXXXXXXXModule'
tag_test
Entering 'XXXXXXXXModule'
tag_test
Entering 'XXXXXXXXUtilsLibrary'
tag_test
Entering 'XXXXXXXX_Master'
tag_test
Entering 'XXXXXXXXModule'
tag_test
Entering 'XXXXXXXXModule'
tag_test
Entering 'XXXXXXXXLibrary'
tag_test
Entering 'XXXXXXXXApiModule'
tag_test
Entering 'XXXXXXXXModule'
tag_test
都已经成功打上了tag。
推送到gitlab
主仓库和模块的仓库依然需要分别推送
把子模块刚刚打的tag推送上去:
git submodule foreach git push origin tag_test
结果
Entering 'XXXXXXXXModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXModule.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXModule.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXUtilsLibrary'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXUtilsLibrary.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXX_Master'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXX_Master.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXModule.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXModule.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXLibrary'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXLibrary.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXApiModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXApiModule.git
* [new tag] tag_test -> tag_test
Entering 'XXXXXXXXModule'
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXXModule.git
* [new tag] tag_test -> tag_test
然后推送主仓库:
git push origin tag_test
推送成功
Total 0 (delta 0), reused 0 (delta 0)
To http://gitlab.XXXXXXXX_Master.git
* [new tag] tag_test -> tag_test
删除tag
因为标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d tag_test
然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/tag_test
删除成功:
To http://gitlab.XXXXXXXX_Master.git
- [deleted] tag_test
然后本地逐模块删除tag:
git submodule foreach git tag -d tag_test
然后远程删除:
git submodule foreach git push origin :refs/tags/tag_test
删除成功:
Entering 'XXXXXXXXModule'
To http://gitlab.XXXXXXXXModule.git
- [deleted] tag_test
Entering 'XXXXXXXXModule'
To http://gitlab.XXXXXXXXModule.git
- [deleted] tag_test
Entering 'XXXXXXXXUtilsLibrary'
To http://gitlab.XXXXXXXXUtilsLibrary.git
- [deleted] tag_test
Entering 'XXXXXXXX_Master'
To http://gitlab.XXXXXXXX_Master.git
- [deleted] tag_test
Entering 'XXXXXXXXModule'
To http://gitlab.XXXXXXXXModule.git
- [deleted] tag_test
Entering 'XXXXXXXXModule'
To http://gitlab.XXXXXXXXModule.git
- [deleted] tag_test
Entering 'DiscoveryLibrary'
To http://gitlab.intsig.net/CCAndr/DiscoveryLibrary.git
- [deleted] tag_test
Entering 'XXXXXXXXApiModule'
To http://gitlab.XXXXXXXXApiModule.git
- [deleted] tag_test
Entering 'XXXXXXXXModule'
To http://gitlab.XXXXXXXXModule.git
- [deleted] tag_test
重命名tag
git并没有直接重命名tag的命令,所以需要其他的方法。
参考这个网站
#创建一个旧的tag
git tag old
#创建一个依赖old的新标签
git tag new
#删除旧的标签
git tag -d old
git push origin :refs/tags/old
#上传新的标签
git push origin --tags
对模块的操作类似,不过是需要在每个命令前加一句
git submodule foreach