摘要
https://wylu.github.io/posts/3504e7d9/
Git 子模塊(Git submodules)允許你將 git repo 保留爲另一個 git repo 的子目錄。Git 子模塊只是在特定時間快照上對另一個 repo 的引用。Git 子模塊使 Git repo 能夠合併和跟蹤外部代碼的版本歷史。
添加子模塊
通過下列命令,可以將在一個已存在的 Git 倉庫添加爲當前工作的倉庫的子模塊:
$ git submodule add <repo url> [submodule path]
例如,在一個 Hexo 博客倉庫下添加一個主題倉庫 NexT:
$ git submodule add https://github.com/wylu/hexo-theme-next themes/next
默認情況下,如果沒有指定子模塊存放路徑,子模塊將會放到一個與倉庫同名的目錄中。如果你想要放到其他地方,那麼可以在命令結尾添加一個不同的路徑,本例中子模塊將會 clone 到 “themes/next” 目錄下。
命令執行完成後,會在當前工作倉庫根目錄下生成 .gitmodules 文件,內容如下:
[submodule "themes/next"]
path = themes/next
url = https://github.com/wylu/hexo-theme-next
該文件保存了項目 URL 與已經拉取的本地目錄之間的映射,如果有多個子模塊,該文件中就會有多條記錄。要重點注意的是,該文件應像 .gitignore 文件一樣受到(通過)版本控制,和該項目的其他部分一同被拉取推送。有了映射關係,克隆該項目的人就知道去哪獲得子模塊了。
添加子模塊完成後,當在父倉庫時,Git 仍然不會跟蹤 submodule 的文件, 而是將它看作該倉庫中的一個特殊提交。
推送到遠程倉庫後,遠程倉庫中 submodule 會和指定的 commit 關聯起來。如果需要指定分支,可以在 “.gitmodules” 文件中加上 branch 配置,如 branch = develop
。
克隆含有子模塊的項目
接下來我們將會克隆(clone)一個含有子模塊的項目。 當你在克隆這樣的項目時,默認會包含該子模塊目錄,但其中還沒有任何文件,你需要執行兩個命令以拉取子模塊:
$ git submodule init
$ git submodule update
git submodule init
用來初始化本地配置文件,而 git submodule update
則從子項目中抓取所有數據並檢出父項目中列出的合適的提交。
或者:
git clone --recursive <parent repo url>
刪除子模塊
-
把子模塊從版本控制系統中移除
$ git rm --cached <submodule path>
-
刪除子模塊目錄
$ rm -rf <submodule path>
-
編輯 “.gitmodules”,移除相應 submodule 節點內容
-
編輯 “.git/config”,移除相應 submodule 配置
-
如果有 “.git/modules” 目錄,還應刪除其下的相應子模塊的目錄
以上面的 NexT 子模塊爲例:
$ git rm --cached themes/next
$ rm -rf themes/next
然後刪除 “.gitmodules” 中如下內容:
[submodule "themes/next"]
path = themes/next
url = https://github.com/wylu/hexo-theme-next
最後刪除 “.git/config” 中如下內容:
[submodule "themes/next"]
url = https://github.com/wylu/hexo-theme-next
active = true
要把此次修改同步到遠程庫,還需要 push 一下。