git 子模塊在項目中的使用

在公司的項目中, 經常會遇到一些公共的內容, 多個項目中間通用的, 不可能每次都將整個代碼複製一遍, 遇到這種情況有很多不同的解決方案, 一般來說, 項目是通過 git 來管理的, 巧了, git 也同樣支持子模塊.

創建子模塊

git submodule add [email protected]:hujingnb/submodule_son.git submodule_son

指定子項目地址, 後面的參數可以更改子模塊的路徑. 這步操作可給當前項目添加一個子模塊.

克隆新項目

當團隊加入新人時, 需要將原項目 down 下來. 操作如下:

  • git clone xxxx.git (克隆項目)
  • git submodule init (子模塊初始化)
  • git submodule update (更新子模塊)

當然, 最好一條命令就能搞定:

git clone --recursive xxxx.git

子模塊操作

對於子模塊的更新,提交等操作, 進入對應路徑, 正常操作即可.

問題

以上對於子模塊的使用, 網上有各種教程, 在此不再贅述.

而我在使用中遇到的問題是這樣的: 公司的代碼庫分爲測試環境與生產環境兩個分支: dev, master. 由於git對於子模塊的管理並不是基於分支, 而是基於commit id的. 這對於引用第三方庫是可以理解的, 畢竟需要一個穩定的版本嘛. 但是對於公司這種需要頻繁更新的項目, 就有些混亂了.

舉個例子, 經常會有多個任務並行執行的情況, 如果有些任務後開發, 又需要先行合到生產環境, 可能會提交了較新的commit id上去. 故而並不像分支管理一樣, 直接拉取分支即可. 這又該如何是好呢?

不同分支

對於這個問題, 我想了很久. 要想實現分支的正常管理, 還是應該不同環境對應不同的分支, 但是子模塊只能指定commit id, 不能對應分支. 如此一來, 那就只有一個辦法, 不同分支指定不同的commit id, 這也是我能想到的最清楚,最符合流程的方式了. 也就是說, 子模塊也切爲dev, master兩個分支, 也正常進行合併. 而對於父項目來說, 將子項目切換到不同的分支, 每次提交之後, 將子模塊分支拉取到最新, 然後將commit id提上去, 不就解決了麼...

流程如下:

  1. 切換子模塊分支: git submodule foreach git checkout master
  2. 將子模塊分支拉取到最新: git submodule foreach git pull
  3. 提交commit id: git add .; git commit -m ""; git push;

然後將以上操作寫到腳本中, 每次自動化拉取最新代碼即可.

如此一來, 子模塊的管理就和正常流程一致了, 將不同環境代碼合併到不同分支, 分別拉取對應分支代碼即可.

此方法是我自己想到的, 是否可行還有待驗證

子模塊衝突

既然子模塊是根據commit id進行管理的, 那麼當不同的人提交了不同的commit id上來的時候, 就很有可能存在衝突.

先說一下我是如何製造衝突的:

  1. 父項目與子模塊分別拉取分支: master_tmp
  2. 父項目與子模塊切回master分支
  3. 子模塊修改文件並提交, 父項目更新commit id
  4. 此時父子都回到master_tmp分支, 修改同一行內容,並提交commit id
  5. 將父項目master_tmp合併到master分支

此時衝突如下:

image-20201031170232767

對於沒有接觸過子模塊的我來說, 有如下問題:

  1. 這兩個commit id我怎麼知道哪個是最新的? 總不能一個一個去找吧
  2. submodule_son 連個文件都沒有, 我該怎麼解決這個衝突???

如此該如何解決呢? 很明顯, 這個衝突是子項目的衝突, 所以要進入子項目解決. 主要的思想當然還是解決分支之間的衝突.

  1. 將子模塊分支切到master: git checkout master
  2. 將子模塊產生衝突的提交新建一個分支: git branch merge_tmp a8f5f8c
  3. 將子項目合併到master: git merge merge_tmp
  4. 解決子項目的衝突
  5. 再次回來查看, 衝突解決, 提交即可

子模塊衝突解決完畢後, 再回來查看:

image-20201031170629675

此時衝突已經解決完成, 提交即可.

同理, 當你不方便操作master分支的時候, 將master合併到你自己的分支, 然後解決衝突, 是一樣的.


至此, 基本解決了子模塊的不同環境問題, 後面遇到問題再說吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章