當我們要把另一個倉庫的代碼作為子目錄放到當前倉庫時,為了防止代碼冗余,我們應該使用 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
刪除相關內容