在開發的過程中我們的項目可能會引用其他的版本庫中的代碼, 例如公司已經累積了一套公用的函式庫, 被多個項目調用; 很顯然地, 不能把公用函式庫的文件直接放到我們開發中的項目中, 這樣不但項目的冗餘, 也增加維護的難度, 無疑是替自己找麻煩.
這時候我們就可以使用Git中submodule功能, 來管理我們的子模版, 在這裡我們配合使用GUI SourceTree(以下就簡稱ST吧), 以下就進入正文囉......
1. 準備工作
首先我們先建立兩個Repository分別叫smMain以及smLibA, 並把它們push到Git Server(ex: github, bitbucket…etc.), 在這裡就不多說了.
bitbucket
smMain: https://bitbucket.org/youngce/smmain
smLibA: https://bitbucket.org/youngce/smliba
2. 加入Submodule
在{path}/smMain中使用git submodule add命令添加submodule
git submodule add https://[email protected]/youngce/smliba.git libs/smlibA
libs/smlibA表示將子模塊clone到{path}/smMain/libs/smlibA路徑下, 成功訊息如下圖,
在smMain資料夾中可以發現多一個libs資料夾了, 在ST也出現了uncommitted changes以及submodules了
接下來Commit再Push就好了.
其實我們可以從上圖的libs/smlibA的檔案內容看出來, 在smMain的repository就只是記錄subproject 的commit id 而已.
3. Submodule更新
當發現smLibA更新時, 如何在smMain也進行更新呢??
首先我先更新一下smLibA,
點擊smMain的Tag, 然後點開Submodules, 在smLaibA上點擊兩下
這時會開啟一個名為smLibA的新Tag, 這個smLibA指的smMain下的smLibA, 接下來就按下Pull做更新了
回到smMain會發現新的uncommitted, libs/smLibA中的subproject commit已經被修改為最新的commit id了
最後別忘了commit+push就完成了.
4. Submodule修改
在開發的過程可能會解決一些子項目的Bug或增加函式, 那如何做這樣的修改並更新到子項目的repository呢??
在這裡, 將由smMain中修改smLibA, 最後再push到真正的smLibA的repository.
就直接由smMain資料夾中對libA.txt做修改吧!! 在修改完後你會發現ST中smMain並沒有出現uncommitted,
那剛剛的修改是跑去哪裡了呢?? 開啟submodule的smLibA看看吧!! 其實你可以想像submodule是存在於
git repository中的repository(submodule), git repository只記錄目前repository(submodule), 是對應到哪個
commit id, 而repository(submodule)自己管理自己修改.
接著commit+push, 別以為這樣就結束了, 我們還要去確定smMain的subproject commit有沒有被修改, 要不然
下次Pull下來的時候我們submodule就不是我們修改過的!!
最後就Commit+Push吧!!