移除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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Git submoduleGit 的一个功能,可以将一个 Git 仓库作为另一个 Git 仓库的子目录进行管理。通过使用子模块,我们可以在一个 Git 仓库中使用另一个 Git 仓库的组件。 使用 git submodule 的步骤如下: 1. 在父项目中添加子模块:使用命令 `git submodule add <子模块仓库地址> <子模块存放路径>` 将子模块添加到父项目中。 2. 克隆子模块:使用命令 `git submodule init` 初始化子模块,然后使用命令 `git submodule update` 克隆子模块的内容。 3. 切换到子模块分支:通过 `cd <子模块路径>` 进入子模块目录,然后使用 `git checkout <分支名>` 切换到子模块所在的特定分支。 4. 更新子模块:在父项目中使用命令 `git submodule update --remote` 可以更新子模块为最新的提交。 5. 提交子模块修改:在父项目中修改了子模块后,需要切换到子模块目录,进行提交和推送操作。 使用子模块的好处是可以将子项目作为独立的仓库进行开发和维护,同时在父项目中方便地使用和更新子模块。使用子模块可以实现项目的模块化和复用,提高代码的可维护性和可重用性。 需要注意的是,使用子模块时需要注意子模块的分支和版本控制,因为子模块可能会更新,需要及时更新父项目中的子模块。同时,在多人协作开发中,也需要注意在提交父项目时确保子模块的修改也已经提交。 总之,使用 Git submodule 可以方便地在父项目中使用子模块的组件,提高代码管理的灵活性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值