Git submodule 相關操作

Git submodule 相關操作

2022, Nov 18    

最近在公司碰到一些案子有在 git repo 中用到 submodule 的機制,但總覺得有點複雜而且有的操作不是太直覺,決定來紀錄一下

Git submodule

submodule 的概念就是在一個 git repo 中又嵌套另一個 repo,並且版控的單位會變成 repo 的版號

便利於將兩個相關聯的 repo 放在一起,大部分 submodule 可能會用於公用的 lib 或是整個大專案就是由數個 module 組成的,那有時候也會用這種方式管理定版

新增

只要在 root repo 的目錄下,指定 submodule 的 repo url 以及要放的路徑,輸入下面指令

git submodule add <repo-url> <path>

要注意的是路徑不能是已經存在的目錄,這個指令會幫你建好目錄

輸入完會發現多了一個 .gitmodules 的檔案,裡面會紀錄 submodule 的設定

詳細到 .git/config 也會看到 submodule 相關以及 .git/modules 也會新增相關的 repo 資訊

submodule 主要就是這三個地方的設定來綁定的

設定完之後還要記得 commit,這時候下 git status 會發現一個變更是以 repo 為單位

這個變更根據的就是 repo 的 commit id,之後有更新 submodule 的話也就按照一般變更處理

同步 submodule

在一個全新的機器上如果需要拉取 submodule 的內容,直接 git clone 是抓不下來的

會發現 submodule 目錄裏面是空的,需要下面指令

git submodule update --init

如果是已存在的 submodule 要更新

git submodule update

如果主 repo 跟 submodule 都有更動需要一起更新的話可以

git pull --recurse-submodules

移除 submodule

移除就比較麻煩了,一直很疑惑為什麼沒有個指令可以幫忙直接做完這件事

git submodule deinit <submodule path>
git rm --cached <submodule path>
rm -rf <submodule path>
rm -rf .git/modules/<submodule path>

必須要用四行指令才能完整移除 submodule 真的麻煩