git submodule
git submodule 的作用是將一個 git 倉庫,最為另一個 git 倉庫的子模塊
比如
A 倉庫地址:git@github.com:xxxxxxx/A.git
B 倉庫地址:git@github.com:xxxxxxx/B.git
一、克隆 A 倉庫
打開拉取的 A 項目根目錄
在 A 項目中添加 B 項目的 git 倉庫,作為子模塊,設置 B 項目在 A 項目中的路徑是 A/client/Assets/B
打開命令行,執行命令
git submodule add git@github.com:xxxxxx/B.git client/Assets/B
A 項目目錄下出現兩個文件
.gitmobule
client/Assets/B
打開 .gitmodule
顯示 三行信息
[submodule "client/Assets/B"]path = client/Assets/Burl = git@github.com:XXXXXX/B.git
這里一般默認使用 submodule 倉庫 (B)的 master 或者 main 分支
如果想使用哪一個分支,添加 branch,修改如下
[submodule "client/Assets/B"]path = client/Assets/Burl = git@github.com:LIQIANGEASTSUN/B.gitbranch = master_sdk # 確保這里是 master_sdk 分支
在可視化 git 工具,如:SourceTree 上選擇 client/Assets/B 可以看到 里邊是一條指向 B 項目某一次提交的 commit
B 倉庫作為 A 倉庫的 submodule,此時 B 倉庫并不是在哪個分支上,而是在 B 倉庫的某一條提交
A 倉庫只是在使用 B 倉庫某一次提交的狀態,具體細節可以自行查資料
二、初始化子模塊,執行命令
git submodule init
三、更新 submodule,執行命令
git submodule update
git submodule update 命令會將子模塊檢出到父倉庫中記錄的提交
只有在明確地更新并提交了子模塊的狀態后,父倉庫才會知道子模塊現在指向的是最新的提交
要確保當前使用的 submodule 是最新的提交,遞歸的將所有子模塊更新到遠程倉庫的最新提交
執行命令:
git submodule update --remote --recursive
如果只是想更新具體的 submodule 如 client/Assets/B,將 --recursive 替換為具體的 submodule 名
執行命令
git submodule update --remote client/Assets/B
四、提交子模塊的更新
更新子模塊后,需要將子模塊的狀態提交到父倉庫,執行以下命令:
git add client/Assets/B
git commit -m "Update submodule to latest commit"
git push
五、查看 submodule 狀態
git submodule status
輸出:daddf8e4fe8b122128c63d69fd73fd031269285a client/Assets/B(heads/master_sdk)
六、已經克隆的項目更新 submodule
一個項目已經克隆到本地了,別人添加了一個 submodule 并提交,我們本地倉庫需要更新,執行命令:
# 初始化和更新所有子模塊
git submodule update --init --recursive
然后執行 三、四
七、克隆一個添加了 submodule 的倉庫
執行命令
git clone --recurse-submodules git@github.com:XXXXX/A.git
git submodule update --init --recursive
執行 三 、四
如果克隆時沒有添加 --recurse-submodules
克隆完成后,執行 二、三 、六、七
八、刪除子模塊
- 刪除子模塊的條目
首先,從 .gitmodules 文件中刪除子模塊的相關配置
打開 .gitmodules 文件,找到并刪除與要移除的子模塊相關的條目,如下
[submodule "client/Assets/B"]path = client/Assets/Burl = git@github.com:xxxxxx/B.gitbranch = master_sdk # 確保這里是 master_sdk 分支
- 刪除子模塊的配置
接下來,從 Git 配置中刪除子模塊的條目。您可以使用以下命令:
git config --remove-section submodule.client/Assets/B
也可以打開 .git/config
文件手動刪除,如下
[submodule "client/Assets/B"]active = trueurl = git@github.com:LIQIANGEASTSUN/B.git
- 刪除子模塊的目錄
.git\modules\client\Assets\B
目錄
rm -rf client/Assets/B
- 將這些更改提交到父倉庫
git add .gitmodules
git commit -m "Remove submodule client/Assets/B"
git push
- 清理 Git 緩存(可選)
如果希望完全清理 Git 的緩存,可以運行以下命令:
git rm --cached client/Assets/B
- 移除子模塊
首先,使用以下命令移除子模塊:
取消子模塊的初始化
git submodule deinit -f client/Assets/B
從工作目錄和索引中移除子模塊
git rm -f client/Assets/B