天天看點

移除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 = [email protected]: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 = [email protected]: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