Git submodule使用指南(一)

watcherlin發表於2019-04-03

問題場景

相信任何開發,都會遇到一種情況。在做不同的專案,但是又都會使用到一些常用的方法_元件_程式碼塊等等。 作為一個追求優雅的開發人員,肯定不能接受一段程式碼到處複製貼上的操作。而且一旦這段程式碼日後需要更新,到處貼上的話就需要全域性搜尋然後含淚修改了。 那麼有沒有一種辦法,能夠作為一些公共程式碼的“棲息地”,可以做到一處編寫,到處使用呢?

答案是有的。


尋找工具

經過在知名404網站上一番搜尋,找到了Git內建的一個功能:submodule。

什麼是submodule

有種情況我們經常會遇到:某個工作中的專案需要包含並使用另一個專案。 也許是第三方庫,或者你獨立開發的,用於多個父專案的庫。 現在問題來了:你想要把它們當做兩個獨立的專案,同時又想在一個專案中使用另一個。

Git 通過子模組來解決這個問題。 子模組允許你將一個 Git 倉庫作為另一個 Git 倉庫的子目錄。 它能讓你將另一個倉庫克隆到自己的專案中,同時還保持提交的獨立。


如何使用

新增子模組

# 直接clone,會在當前目錄生成一個someSubmodule目錄存放倉庫內容
git submodule add https://github.com/chaconinc/someSubmodule

# 指定檔案目錄
git submodule add https://github.com/chaconinc/someSubmodule  src/submodulePath
複製程式碼

新增成功之後,執行git status會在父倉庫發現增加了2個變化

  1. new file: .gitmodules
  2. new file: someSubmodule(實際上並不是一個file)

展開說說:

  1. 什麼是.submodules .submodules是記錄當前專案的子模組配置的檔案,裡面儲存了專案 URL 與已經拉取的本地目錄之間的對映。

  2. 子模組目錄 在新增完子模組之後,執行git status之後,會看到類似下面的資訊

$ git diff --cached someSubmodule
diff --git a/someSubmodule b/someSubmodule
# 重點是下面這行的 160000
new file mode 160000
index 0000000..c3f01dc
--- /dev/null
+++ b/DbConnector
@@ -0,0 +1 @@
+Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc
複製程式碼

雖然someSubmodule是父倉庫裡面的一個目錄,但是Git並不會列出裡面所有的變化,而是會當做一個特殊的提交。 PS:160000模式。 這是 Git 中的一種特殊模式,它本質上意味著你是將一次提交記作一專案錄記錄的,而非將它記錄成一個子目錄或者一個檔案。

clone已經包含子模組的專案

正常clone包含子模組的函式之後,由於.submodule檔案的存在someSubmodule已經自動生成。但是裡面是空的。還需要執行2個命令。

# 用來初始化本地配置檔案
git submodule init
# 從該專案中抓取所有資料並檢出父專案中列出的合適的提交(指定的提交)。
git submodule update
------------------更好的方式---------------------
# clone 父倉庫的時候加上 --recursive,會自動初始化並更新倉庫中的每一個子模組
git clone --recursive https://github.com/chaconinc/MainProject
複製程式碼

git submodule 工作流

當一個專案裡面包含子模組的時候,不僅僅需要對父倉庫進行版本管理,子模組目錄下也是存在版本的。那在不同的父倉庫下面如何進行子模組的版本管理也成為新的問題。

最簡單的辦法,就是主專案只專注使用子模組的master分支上的版本,而不使用子模組內部的任何分支版本。

操作如下:

cd submodulePath
git fetch
git merge origin/master
複製程式碼

此時在主專案就能看到submodule目錄已經更新了。 當然這也操作有點不方便,下面是更簡便的方法:

# Git 將會進入子模組然後抓取並更新,預設更新master分支
git submodule update --remote
複製程式碼

如果需要更新其他分支的話,需要另外配置。

# 將git submodule update --remote 的分支設定為stable分支
git config -f .gitmodules submodule.DbConnector.branch stable
複製程式碼

注意事項

未完待續


關注一下給予鼓勵

關注一下給與鼓勵

參考文件:

  1. Git - 子模組

相關文章