Git 系列文章

webxiaoma發表於2018-09-26

相關文章

Git的子模組

常用基礎指令

知道了git的大概工作的大概流程我們來實踐一下git的基礎操作

  • git submodule add 遠端倉庫地址 新增子模組
  • git submodule init 初始化本地配置檔案
  • git submodule updata 拉取子模組資料
  • git clone --recursive 遠端倉庫地址 克隆包含子模組的倉庫(不用初始化)
  • git rm 子模組 刪除子模組
  • git submodule foreach 操作命令 遍歷子模組執行同樣的命令

來自官網有種情況我們經常會遇到:某個工作中的專案需要包含並使用另一個專案。 也許是第三方庫,或者你獨立開發的,用於多個父專案的庫。 現在問題來了:你想要把它們當做兩個獨立的專案,同時又想在一個專案中使用另一個。這個時候我們就需要用到git的子模組功能了。

說白了我們要做的就是在一個git倉庫中在克隆一個git倉庫做為它的子倉庫

使用子模組

1. 新增子模組

比如我們已經有一個test倉庫了,我們在該倉庫中加入一個project倉庫來作為它的子模組,我們來test倉庫中執行git submodule add 遠端倉庫地址

 git submodule add git@github.com:webxiaoma/project.git

執行完後我們會看到自我們的test倉庫中有了一個project倉庫,而且在根目錄下多了一個.gitmodules 檔案,這個檔案中記錄著我們子倉庫的資訊

[submodule "project"]
    path = project
    url = git@github.com:webxiaoma/project.git

並且我們現在可以進入我們的版本庫.git 目錄來看一下,該目錄中會多出一個modules 資料夾,該資料夾中儲存了我們project 倉庫的一些配置資訊和版本,他就是我們子倉庫的版本庫,在我們的config配置檔案中也多出了一個submodule模組來記錄我們子倉庫的遠端地址

// 上省略
[submodule "project"]
    url = git@github.com:webxiaoma/project.git
    active = true

另外對子模組project的git操作和平常命令一樣,我們只要在子模組中去執行就可以。

2. 克隆含有子模組的倉庫

這裡為了操作克隆含有子模組的倉庫,我們將我們上面test倉庫提交併推送到遠端,之後我們刪除本地test倉庫,然後我們來克隆它,這裡將帶有子模組的倉庫克隆下來並初始化有兩種方法:

第一種方法

git clone git@github.com:webxiaoma/test.git

克隆下來後我們進入子模組project目錄中,會發現該目錄是空的,我們需要初始化子模組。

// 初始化本地配置檔案
git submodule init

// 則從該專案中抓取所有資料並檢出父專案中列出的合適的提交
git submodule updata

第二種方法

這種方法克隆下拉的倉庫它的子倉庫就已經初始化好了

git clone --recursive git@github.com:webxiaoma/test.git

3. 推送子模組

推送子模組我們可以直接在子模組中執行git push,如果提示你執行 git push origin HEAD:<遠端分支名>, 你檢視一下你是否處於子模組的master 分支,如果不是切換到master分支去推送,推送完成後我們再去推送我們的父模組。

4. 更新子模組

我們更新子模組有兩種方法。第一種方法我們在子模組目錄直接使用git pull;

第二種方法是使用git submodule update --remote 子倉庫名

git submodule update --remote project

5. 刪除子模組

刪除子模組我們可以使用

git rm project

這樣刪除的子模組其實只是把我們子模組的資料夾刪除了,並沒有將子模組的資訊刪徹底,我們還要進入.git/module 目錄中將project目錄刪除(這個目錄對應的是子模組的的目錄,如果你的模組叫lesson,那麼就在.git/module 目錄中刪除對應的lesson目錄)。

6. 批量操作子模組

如果主倉庫中含有很多的子模組,我們在推送主倉庫時需要先推送每一個子模組,這樣操作很麻煩,我們可以使用git submodule foreach 命令foreach可以遍歷所有子模組並執行我們要執行的命令。例如我們推送所有子模組

git submodule foreach `git pull`

相關文章