移除git submodule并将模块转为普通模块依赖

之前的项目分了几个模块,每个模块是独立的一个 git 工程,模块之间有依赖关系,所以通过 git submodule 的方式进行模块依赖。这样的好处是可以实现模块之间的依赖引用,但是又不会导致修改依赖模块时需要将修改的代码复制到每个父工程。

后面的项目中由于产品需求调整了,之前依赖的模块需要合并到一起。也不再需要分不同的 git 仓库进行模块依赖了。在原项目原有 submodule 依赖的情况下,可以通过以下的处理进行调整。

注意:通过这种方式移除 submodule 的话,是不会删除掉子模块的本地文件的

1. 调整前

  1. 分别有模块A,模块B,模块C。
  2. 其中模块A 作为模块B 的 submodule ,模块B 作为模块C 的 submodule
//结构大致如下
|-C
  |-B
    |-A

2. 调整后

  1. 依赖分别是模块A,模块B,模块C
  2. 其中模块A依然通过 submodule 引用(此时A依然是B的子模块),模块B 整合到模块C 工程中,直接进行依赖,不再通过 submodule 进行引用
//结构大致如下
|-C
|-B
  |-A

3. 调整方法

3.1. 移除掉 git submodule 的配置信息

  1. 进行项目文件夹,cd 到 .git 配置文件夹中,查看 config 文件,删除掉 submodule 的依赖配置
//进入.git文件夹
cd .git 
//编辑 confg 文件
vim confg

其中 config 文件大致如下:

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@xxx.com.cn:xx/xxx.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[submodule "B"]
	//这里就是依赖的子模块的信息,把submodule一整个部分都删除掉
	url = https:/xxx.com.cn/xxx/xxx.git
	active = true

删除后的 config 文件如下:

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@xxx.com.cn:xx/xxx.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
  1. 删除掉 submodule 的配置信息后,还没有清除掉 .git 的缓存信息,需要在 .git 文件夹下删除掉 modules 文件夹下的子模块依赖
cd .git
cd modules
ls
//这里显示出来的就是子模块的名称了,该文件夹下就是保存的子模块的相关配置缓存信息,把模块对应的文件夹整个删除掉
B

3.2. 更新 git 配置保存

  1. 通过以上方式就移除掉了 submodule 的依赖了,可以查看 git 的状态并保存修改
//这里应该会查看到 android 的模块被删除的信息
git status
//保存所有缓存的数据和修改
//这里保存的话,是会看到原来子模块的拉下来的本地文件,也会全部被添加到 git 的工作区中
//这样就可以实现子模块的所有数据全部不丢失转成本地文件模块依赖到项目中,而不是通过submodule的方式链接进行模块依赖
git add .
  1. 最后确认保存的子模块是OK的话,就可以提交了

3.3. 补充模块A的依赖

通过上面的操作,就可以把模块B 从 git submodule 的依赖转成直接通过本地模块进行依赖。此时模块B 是与模块C 一起在同一个工程同一个仓库中的。(注意原来模块A/B/C都是独立的仓库的)

通过以上操作,由于模块A是模块B的依赖,所以删除掉模块B的 git submodule 依赖时,模块A自然也就删除掉了。

这里我们想把模块A重新再通过 git submodule 的方式引用回项目中,依然保持一个独立的仓库。直接参考 git submodule 的导入方式即可。

  1. 如果模块B中(当前项目C中的本地模块B,不是原仓库的模块B)有 .gitmodules 的模块依赖配置文件,由于依赖已经失效,直接删除掉
|-C
|-B
  |-.gitmodules//配置文件,直接删除掉
  1. 按正常操作将模块A依赖到模块B中即可。注意,由于现在模块B与模块C在同一级别,同属于这个工程,所以在这个工程下直接依赖模块 A 即可
//cd 到当前工程目录下(即模块B与模块C共同所在的目录)
cd /project
//注意这一步不需要cd到模块B的文件夹下,因为是对整个工程添加依赖,模块B现在已经是个普通本地文件夹,不再是个git工程了
git submodule add 模块A的git地址
//初始化
git submodule init
//更新
git submodule update

通过以上操作,即可正常引入模块A了,然后检测一下原来模块B中是否需要调整依赖的模块A的工程名就行了。

//假设模块A在 settings.gradle 中的工程名是 
:business-a
//模块B中对A的引用
implementation project(':business-a')

4. 补充vim操作

vim config
//进入编辑模式
i
//退出编辑模式
esc
//保存并退出
:wq

版权声明:本文为u011374875原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>