git submodule 的使用


當我們要把另一個倉庫的代碼作為子目錄放到當前倉庫時,為了防止代碼冗余,我們應該使用 git 的子模塊 submodule 功能。

引入

https://github.com/my/repo.git 引入當前項目,創建一個folder 文件夾來存放代碼。

git submodule add https://github.com/my/repo.git folder

此時倉庫里會有個 .gitmodules 文件,記錄了子倉庫信息。我們可以添加多個子倉庫。

提交

對主倉庫、子倉庫都更新代碼后,我們提交時,需要依次對兩個倉庫的 repo 進行提交。在主倉庫里進行 git diff 會看到

--- a/folder
+++ b/folder
-Subproject commit 8ffcce923b69d314938ce5485f2ac022986aebcb
+Subproject commit 8ffcce923b69d314938ce5485f2ac022986aebcb-dirty

也就是說主倉庫會記錄當前該文件夾所用的子項目的 commit 號,所以應該先提交子倉庫,再提交主倉庫。

拉取

加上--recurse-submodules 參數可以在克隆時初始化並更新子模塊。

git clone xx.git --recurse-submodules
  • 如果用的是 zsh,自帶的 alias gcl='git clone --recurse-submodules',也就是用 gcl xx.git 就可以了。

  • 一些文章提到的 --recursive 參數也是一樣的作用。

初始化和更新

如果項目拉取時沒有加上上面參數,那么需要手動初始化和更新。

初始化並遞歸更新所有子模塊:

git submodule update --init --recursive

也可以分開操作,初始化只需要執行一次:

git submodule init

每次需要更新子倉庫時,運行:

git submodule update

刪除

還沒提交 git 記錄的話,把下載的文件夾和 .gitmodules 中相關內容刪除即可。否則:

  • git rm --cached folder 刪除目錄
  • .gitmodules 刪除相關內容
  • .git/config 刪除.git 中相關內容
  • rm -rf .git/modules/folder 刪除相關內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM