Git子模塊

摘要

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>

刪除子模塊

  1. 把子模塊從版本控制系統中移除

    $ git rm --cached <submodule path>
    
  2. 刪除子模塊目錄

    $ rm -rf <submodule path>
    
  3. 編輯 “.gitmodules”,移除相應 submodule 節點內容

  4. 編輯 “.git/config”,移除相應 submodule 配置

  5. 如果有 “.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 一下。

References

https://git-scm.com/book/en/v2/Git-Tools-Submodules

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章