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