首页 > 代码库 > 在SourceTree中使用Git submodule

在SourceTree中使用Git submodule

在開發的過程中我們的項目可能會引用其他的版本庫中的代碼, 例如公司已經累積了一套公用的函式庫, 被多個項目調用;  很顯然地, 不能把公用函式庫的文件直接放到我們開發中的項目中, 這樣不但項目的冗餘, 也增加維護的難度, 無疑是替自己找麻煩.

這時候我們就可以使用Git中submodule功能, 來管理我們的子模版, 在這裡我們配合使用GUI SourceTree(以下就簡稱ST吧), 以下就進入正文囉......

 

1. 準備工作

首先我們先建立兩個Repository分別叫smMain以及smLibA, 並把它們push到Git Server(ex: github, bitbucket…etc.), 在這裡就不多說了.

bitbucket

smMain: https://bitbucket.org/youngce/smmain

smLabA: https://bitbucket.org/youngce/smliba

 

2. 加入Submodule

在{path}/smMain中使用git submodule add命令添加submodule

 

git submodule add https://youngce@bitbucket.org/youngce/smliba.git libs/smlibA

libs/smlibA表示將子模塊clone到{path}/smMain/libs/smlibA路徑下, 成功訊息如下圖,

2014-10-24_1202

在smMain資料夾中可以發現多一個libs資料夾了, 在ST也出現了uncommitted changes以及submodules了


2014-10-24_1224

接下來Commit再Push就好了.

其實我們可以從上圖的libs/smlibA的檔案內容看出來, 在smMain的repository就只是記錄subproject 的commit id 而已.

 

3. Submodule更新

當發現smLibA更新時, 如何在smMain也進行更新呢??

首先我先更新一下smLibA,

2014-10-24_1357

 

點擊smMain的Tag, 然後點開Submodules, 在smLaibA上點擊兩下

2014-10-24_1359

 

這時會開啟一個名為smLibA的新Tag, 這個smLibA指的smMain下的smLibA, 接下來就按下Pull做更新了

 

2014-10-24_1205

回到smMain會發現新的uncommitted, libs/smLibA中的subproject commit已經被修改為最新的commit id了

2014-10-24_1411

最後別忘了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)自己管理自己修改.

2014-10-24_1424

 

接著commit+push, 別以為這樣就結束了, 我們還要去確定smMain的subproject commit有沒有被修改, 要不然

下次Pull下來的時候我們submodule就不是我們修改過的!!

2014-10-24_1446

最後就Commit+Push吧!!

在SourceTree中使用Git submodule