1. 程式人生 > >Git 子模塊:git submodule

Git 子模塊:git submodule

iba 官方 克隆 子模塊 分享 help fbo 主目錄 mode

imtianx

2018年03月08日閱讀 2057

Git 子模塊:git submodule

工作中,可能會遇到在一個Git倉庫 中添加 其他 Git 倉庫的場景。比如,在項目中引用第三方庫。或者在模塊化開發中,某些公共的模塊是需要單獨維護的,使用單獨的倉庫比較方便,但是在項目中需要引用,就會出現這樣的場景。這裏使用 Git 的 git submodule 命令為一個 git 項目 添加 子git項目

可以使用 git submodule --help 查看所有相關命令。 為了方便說明,這裏在主項目 MainProject中加兩個子模塊 libalibb .

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 中存放的為子模塊的信息,使用 catvim查看內容為:

[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
復制代碼

技術分享圖片

使用下面的方式,更新 libbdev 分支:

git config -f .gitmodules submodule.liba.branch dev
git submodule update --remote
復制代碼

如下圖:

技術分享圖片

這裏對 .gitmodules 加了 -f 參數,修改提交後對所有用戶有效。

3. 刪除子模塊

在日常開發中,有添加,當然也會有刪除 子模塊的需求。 這裏主項目包含兩個子模塊:libalibb,以刪除 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