Git學習筆記(三) git submodule
阿新 • • 發佈:2020-07-15
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學習筆記 】