git子模块处理的一些方法

一、实际问题

在实际应用中遇到了一些代码管理问题,一个工程需要依赖其它几个子模块。其中一个模块由于不小心在本地的应用中修改后提交了(即A中有子模块B,直接在A中将B修改提交了,而不是修改B工程,再在A中更新)即开发者将module本地hash提交到了主分支. 因此其它开发者更新时候因为gitlab中不含有这个hash分支而无法正常获取。结果导致服务器打包时无法正常的拉取相关的子模块,最终的现象就是数据不一致,引发了一些模块的崩溃。

二、初步解决

在确定是这个问题后,使用原有的命令:

#enter sub path
git submodule update --remote

本地环境可以实现,但如果使用自动环境(如Jenkins),仍然会拉取老的子模块代码。经过查找相关资料,发现可以使用下面的方法:
1、在Git中删除原子模块的依赖并再次增加
1)删除原子模块
执行下列命令:

git submodule deinit -f 子模块路径
git rm -f 子模块路径
git add -u
git commit -m "删除子模块"
git push
#也可使用其它GIT删除子模块方法 

2)增加相关模块
有两种方法:
第一种是:

git submodule add -b main --force  git@192.168.3.214:libs/子模块名字.git

第二种:

git submodule add <url> <path>
git submodule add <git库URL> path  //如果进入path则不用再指定

然后:

git add .(-u)
git commit
git push

说明:这样做可能不太安全,需要下面的4的处理方式

2、强制更新方式

git submodule foreach git pull origin main
或
git submodule foreach git submodule update --remote(此种未测试)

3、子模块改名
在上述的实际问题中,有一个子模块是需要改名字的,即可能拉下来是A,但实际的名字叫B,可以使用下面的方法:

git mv msglib msg
git submodule sync

它可以放在1的增加相关模块后,注意,如果只是单纯的修改名字,此时就可以使用提交命令提交即可。否则需要等最终一起提交修改。
4、安全说明
如果在上面直接提交子模块的更新,则可能导致安全性的问题,比如提交的有问题。那么可以使用分支的方式进行:

git checkout -b fixmiss_module

git commit -m "fix"

#git push origin fixmiss_module:main

分支提交一般容易为GIT跟踪和控制,这也是一个好的应用习惯。

三、总结

用得越多,遇到的问题也越多,这就是经验的来源。经验是一个好的东西,也是一个不好的东西。它让人可以快速的处理实际问题也可以让人固化于这种思维。至于如何打破这种边界,需要自己不断的学习,与时俱进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值