【Git系列】git submodule-Android組件化單項目多倉庫管理方案

一、基本介紹:

  • 在進行Android組件化過程當中當項目比較大的時候便於複用,或者多個項目共用module。這個時候須要抽取項目公共模塊,並且如今基本是使用git做爲版本控制工具,這樣就變成App Project 有多個module,每一個module都是一個獨立的git repository。並且咱們但願單個的module均可以獨立維護,能夠更方便查看和隨時隨地同步更新。
  • 爲了達成這樣的目的咱們能夠使用git-submodulegit-repo 、gitslave 、git-subtree
  • git-repo更適合管理比較大、module比較多、module會常常變動的項目,Android源碼就是採用這種方式管理;若是module比較少的狀況,使用git-submodule徹底夠用。

二、使用步驟:

  1. 進入到主項目根目錄中輸入命令
    • git submodule add <子module的git地址> : 從遠程倉庫將子module導入到該項目中,這時候會自動生成.gitmodules文件
    • git submodule add <子module的git地址> <主項目內的文件夾>: 從遠程倉庫將子module導入到該項目中的特定文件夾中。
    • git submodule init:初始化本地.gitmodules文件。
    • git submodule update:在父項目中更新子module的修改。
    • git submodule foreach git pull:拉取全部子模塊。
    • git submodule foreach git submodule update:若是你的submodule又依賴了submodule,能夠使用git submodule foreach命令來實現一次性全更新。
    • git clone --recurse-submodules <主項目倉庫地址>:獲取主項目和全部子項目源碼【git pull <主項目倉庫地址>的時候不會同時獲取submodules的源碼】。
  2. 進入到子module目錄中輸入命令
    • 走正常的git add、git commit、git push流程。

三、注意點:

3.一、更新 submodule 的坑:

  • 在父項目中git pull只會更新父項目中的代碼,並不會更新子module項目中的代碼,這時忘記了調用 git submodule update,那麼git push極有可能再次把舊的 submodule 依賴信息提交上去。
  • git pull 以後,當即執行 git status, 若是發現 submodule 有修改,當即執行 git submodule update
  • 若是你的 submodule 又依賴了 submodule,那麼極可能你須要在 git pullgit submodule update 以後,再分別到每一個 submodule 中再執行一次 git submodule update,這裏能夠使用 git submodule foreach git submodule update命令來實現。

3.二、修改 submodule 的坑:

  • 默認 git submodule update 並不會將 submodule 切到任何 branch,因此,默認下 submodule 的 HEAD 是處於遊離狀態的 (‘detached HEAD’ state)。因此在修改前,記得必定要用 git checkout master 將當前的 submodule 分支切換到 master,而後才能作修改和提交。
  • 若是你不慎忘記切換到 master 分支,又作了提交,能夠用 cherry-pick 命令挽救。具體作法以下:
  • git checkout master將 HEAD 從遊離狀態切換到 master 分支 , 這時候,git 會報 Warning 說有一個提交沒有在 branch 上,記住這個提交的 change-id(假如 change-id 爲 aaaa)。
  • git cherry-pick aaaa來將剛剛的提交做用在 master 分支上。
  • git push將更新提交到遠程版本庫中。

3.三、刪除 submodule 的坑:

  • 直接刪除子模塊並不能徹底刪除,再次添加的時候會報錯'<submodule>' already exists in the index.
  • 用如下命令能夠徹底刪除submodule:
git rm --cached submodule子項目名字
    rm -rf submodule子項目名字
複製代碼

參考:blog.devtang.com/2013/05/08/…git

相關文章
相關標籤/搜索