git submodule

情境

事情是這樣的,想要幫自己開發核心函式庫,讓以後開發 web 的時候,可以沒煩沒腦。假設我有一個專案目錄叫做 web ,想要順便幫自己開發工具組叫做 util,放在 libs 下面。所以目錄結構長這樣:

1
2
3
web/
libs/
util/

問題來啦!看起來我 util 應該獨立一個 repository,而 web 專案應該獨立另一個。那我開發的時候,應該怎麼把這兩個 repository 兜在一塊呢?

add submodule

利用 git 的 submodule 可以解決這類的事情。若目錄與 repository 對應關係如下:

1
2
web => git@github.com:ueicren/web.git
util => git@github.com:ueicren/util.git

所以我只要這樣做(此時 libs 下面沒有 util/)

1
2
3
cd web/
git submodule add git@github.com:ueicren/util.git libs/util
git submodule init

看看發生了什麼事?

開發中

接著開發過程中,如果有修改 util 的東西,就得:

1
2
3
4
5
6
7
cd web/libs/util/
git add .
git commit -m "xxx"

# web 主專案也得記錄目前使用的是哪一個版本的 util
cd web/
git commit -am "util improved"

rm submodule

如果想要移除,步驟就比較複雜一點。

1
2
3
4
5
cd web/

git submodule deinit -f -- libs/util
rm -rf .git/modules/libs/util
git rm -f libs/util