git对submodule多模块的tag操作

本文介绍了如何使用Git submodule foreach命令来对多个子模块执行相同的操作,如存储更改、打标签、推送标签到远程仓库及删除标签等。适用于需要对多模块项目进行统一管理的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



作者:三也视界
链接:https://www.jianshu.com/p/527397de5f53
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

### Git Submodule Deinit 使用指南 `git submodule deinit` 是用于取消初始化并移除子模块配置的一个命令。以下是关于该命令的具体使用说明以及常见问题的解决方案。 #### 取消初始化子模块 要取消初始化某个特定的子模块,可以运行以下命令: ```bash git submodule deinit submodule-name ``` 这会从 `.git/config` 文件中删除与指定子模块相关的条目,并将其工作树标记为未初始化状态[^1]。 #### 移除子模块文件和目录 除了 `deinit` 外,还需要通过其他操作彻底清理子模块的相关数据: 1. **从索引中移除子模块路径** 运行以下命令以从 Git 的索引中移除子模块路径: ```bash git rm submodule-name ``` 2. **删除本地子模块的工作目录** 如果子模块已经存在,则需要手动清除其工作目录中的残留内容: ```bash rm -rf .git/modules/submodule-name ``` 完成以上步骤后,提交更改以便保存这些修改到版本库中: ```bash git commit -m "Remove submodule-name" ``` #### 解决常见问题 ##### 问题一:无法找到子模块路径 如果尝试执行 `git submodule deinit` 而收到错误提示找不到对应的子模块路径,可能是因为输入的名字有误或者子模块从未被正确初始化过。可以通过查看当前项目的子模块列表来确认名称是否匹配: ```bash git config --file=.gitmodules --get-regexp path | awk '{print $2}' ``` ##### 问题二:仍有残留记录影响新克隆 即使完成了上述所有步骤,在重新克隆整个项目时仍可能出现旧子模块痕迹的情况。这是因为远程仓库保留了历史信息。此时可以在推送前强制重写分支的历史记录(需谨慎操作),例如: ```bash git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch PATH_TO_SUBMODULE' --prune-empty --tag-name-filter cat -- --all ``` 替换其中的 `PATH_TO_SUBMODULE` 参数为你实际想要移除的那个位置[^3]。 ##### 问题三:更新后的指针不一致 当主仓库引用了一个新的子模块版本而没有同步调整内部链接关系时,可能会遇到所谓的“指针漂移”。这种情况下应该先拉取最新改动再做适当处理: ```bash git pull origin main git submodule update --remote --merge ``` 这样不仅能够获取远端最新的变更集还能自动合并差异部分[^4]。 ### 总结 综上所述,利用 `git submodule deinit` 结合额外的一些辅助指令可以帮助开发者有效地管理复杂依赖结构下的组件化开发模式;同时针对各类异常状况也提供了相应的排查手段和技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值