Git 子模塊:git submodule
imtianx
2018年03月08日閱讀 2057
Git 子模塊:git submodule
工作中,可能會遇到在一個Git倉庫 中添加 其他 Git 倉庫的場景。比如,在項目中引用第三方庫。或者在模塊化開發中,某些公共的模塊是需要單獨維護的,使用單獨的倉庫比較方便,但是在項目中需要引用,就會出現這樣的場景。這裏使用 Git 的 git submodule
命令為一個 git 項目
添加 子git項目
。
可以使用 git submodule --help
查看所有相關命令。 為了方便說明,這裏在主項目 MainProject
中加兩個子模塊 liba
和 libb
.
1. 添加子模塊
進入 MainProject
git submodule add
進行添加,操作命令: git clone https://github.com/imtianx/MainProject.git
cd MainProject/
git submodule add https://github.com/imtianx/liba.git
復制代碼
如下圖:
使用 git submodule add https://github.com/imtianx/libb.git
添加 libb
子模塊。 對於上圖,文件夾 liba
為新增加的子模塊目錄, .gitmodules
中存放的為子模塊的信息,使用 cat
或 vim
查看內容為:
[submodule "liba"]
path = liba
url = https://github.com/imtianx/liba.git
[submodule "libb"]
path = libb
url = https://github.com/imtianx/libb.git
復制代碼
.gitmodules文件:保存項目 URL 與已經拉取的本地目錄之間的映射,有多個子模塊則含有多條記錄,會隨著版本控制一起被拉去和推送的。
此時文件目錄樹如下:
. ├── README.md ├── liba │ ├── README.md │ ├── a.txt │ └── a2.txt ├── libb │ ├── README.md │ ├── b.txt │ └── b2.txt └── test.text 復制代碼
最後,提交添加的子模塊到主目錄
$ git commit -m "add liba and libb submodules"
[master 6b15e30] add liba and libb submodules
3 files changed, 8 insertions(+)
create mode 100644 .gitmodules
create mode 160000 liba
create mode 160000 libb
復制代碼
2. 更新子模塊
往往子模塊是單獨開發的,這裏以更新 liba
為例(為了測試,這裏先在liba倉庫添加了一個文件):
cd liba/
git fetch
git merge origin/master
復制代碼
操作結果如下圖,註意需要進入子模塊目錄:
此外,還可以在主目錄下 直接用下面的命令更新 libb
子模塊:
git submodule update --remote liba
復制代碼
使用下面的方式,更新 libb
的 dev
分支:
git config -f .gitmodules submodule.liba.branch dev
git submodule update --remote
復制代碼
如下圖:
這裏對
.gitmodules
加了-f
參數,修改提交後對所有用戶有效。
3. 刪除子模塊
在日常開發中,有添加,當然也會有刪除 子模塊的需求。 這裏主項目包含兩個子模塊:liba
、libb
,以刪除 liba
為例說明:
- 使用
git rm --cached liba
將liba 從版本控制中刪除(本地仍保留有),若不需要可不帶--cached
進行完全刪除。 - 使用
vim .gitmodules
可打開vim編輯,刪除對應的內容
[submodule "liba"]
path = liba
url = https://github.com/imtianx/liba.git
branch = dev
復制代碼
- 使用
vim .git/config
可打開vim編輯,刪除對應的內容
[submodule "liba"]
url = https://github.com/imtianx/liba.git
active = true
復制代碼
- 使用
rm -rf .git/modules/liba
, 刪除.git下的緩存模塊,最後提交項目。
經過上面的刪除後還可以進行添加子模塊。
4. 克隆含子模塊的倉庫
若需要克隆含有子模塊的倉庫,直接 進行克隆是無法拉取之模塊的代碼,可加上 --recursive
參數,如下:
git clone --recursive https://github.com/imtianx/MainProject.git
復制代碼
或者使用下面的三部操作:
git clone https://github.com/imtianx/MainProject.git
git submodule init
git submodule update
復制代碼
更多子模塊的操作,請參考官方文檔:Git 工具 - 子模塊
Git 子模塊:git submodule