1. 程式人生 > 實用技巧 >Git學習筆記(三) git submodule

Git學習筆記(三) git submodule

1、使用場景

有的時候,我們或許需要在一個專案中包含和使用另外的專案,同時又希望它們能夠保持獨立的開發

這時,git submodule 就可以很方便地幫我們處理這種情況

它能夠將一個倉庫作為另外一個倉庫的子模組管理,同時保持他們都是獨立的提交

2、基本用法

以下是基於父專案的維度管理子模組,在子模組的維度來看,它就和普通的倉庫一樣

  • 新增子模組:git submodule add
> # 新增子模組到父專案的根目錄
> git submodule add <子模組的地址>
> # 新增子模組到父專案指定路徑
> git submodule add <子模組的地址> <本地路徑>

這時我們可以看到,在父專案的根目錄下多了一個 .gitmodules 檔案,並且在指定路徑中多了一個子模組的目錄

.gitmodules 檔案記錄著子模組倉庫與其在父專案中路徑的對映關係,因此它需要和子模組一起納入父專案管理

  • 檢視子模組:git status && git submodule status
> # 檢視狀態
> git status
# 第 1 種情況:子模組中有未追蹤的內容,此時父專案不能將其放入暫存區
# Changes not staged for commit:
# modified:   submodule (untracked content)
# 
# 第 2 種情況:子模組中有修改過的內容,此時父專案不能將其放入暫存區
# Changes not staged for commit:
# modified:   submodule (modified content)
# 
# 第 3 種情況:子模組中有新的提交,此時父專案可以將其放入暫存區
# Changes not staged for commit:
# modified:   submodule-children (new commits)
#
# 第 4 種情況:父專案已經將子模組中新的提交放入暫存區
# Changes to be committed:
# modified:   submodule-children
> # 檢視子模組提交的狀態
> git submodule status
  • 修改子模組

從子模組的維度來看,其實它就是一個普通的倉庫,所有可以應用於普通倉庫的操作都可以應用在子模組上

從父專案的維度來看,父專案不會追蹤子模組的具體內容,它只會追蹤子模組的提交記錄

所以,如果子模組的提交記錄發生變化,父專案就可以通過 git add 以及 git commit 將其納入管理

  • 更新子模組:git submodule update
> # 將所有子模組更新為 本地父專案中的子模組倉庫最新的版本
> git submodule update
> # 將指定子模組更新為 本地父專案中的子模組倉庫最新的版本
> git submodule update <submodule path>
> # 將指定子模組更新為 遠端子模組倉庫特定分支中最新的版本
> git submodule update --remote

這裡需要注意,當執行完 git submodule update 之後,子模組的 HEAD 會處於一個遊離的狀態

我們需要手動將 update 的內容合併到合適的分支,或者使用 --merge 引數自動合併到當前分支

> git submodule update --merge
  • 克隆帶有子模組的專案
> # 方法一:遞迴克隆
> git clone <父專案的地址> --recursive
> # 方法二:先克隆父專案(此時子模組目錄為空),然後初始化並更新子模組
> git clone <父專案的地址> && cd <本地倉庫>
> git submodule update --init --recursive

【 閱讀更多 Git 系列文章,請看 Git學習筆記