相信任何開發,都會遇到一種狀況。在作不一樣的項目,可是又都會使用到一些經常使用的方法_組件_代碼塊等等。 做爲一個追求優雅的開發人員,確定不能接受一段代碼處處複製粘貼的操做。並且一旦這段代碼往後須要更新,處處粘貼的話就須要全局搜索而後含淚修改了。 那麼有沒有一種辦法,可以做爲一些公共代碼的「棲息地」,能夠作到一處編寫,處處使用呢?git
答案是有的。github
通過在知名404網站上一番搜尋,找到了Git內置的一個功能:submodule。bash
有種狀況咱們常常會遇到:某個工做中的項目須要包含並使用另外一個項目。 也許是第三方庫,或者你獨立開發的,用於多個父項目的庫。 如今問題來了:你想要把它們當作兩個獨立的項目,同時又想在一個項目中使用另外一個。函數
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個變化fetch
展開說說:網站
什麼是.submodules .submodules是記錄當前項目的子模塊配置的文件,裏面保存了項目 URL 與已經拉取的本地目錄之間的映射。ui
子模塊目錄 在新增完子模塊以後,執行git status
以後,會看到相似下面的信息spa
$ 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 中的一種特殊模式,它本質上意味着你是將一次提交記做一項目錄記錄的,而非將它記錄成一個子目錄或者一個文件。3d
正常clone包含子模塊的函數以後,因爲.submodule文件的存在someSubmodule已經自動生成。可是裏面是空的。還須要執行2個命令。
# 用來初始化本地配置文件
git submodule init
# 從該項目中抓取全部數據並檢出父項目中列出的合適的提交(指定的提交)。
git submodule update
------------------更好的方式---------------------
# clone 父倉庫的時候加上 --recursive,會自動初始化並更新倉庫中的每個子模塊
git clone --recursive https://github.com/chaconinc/MainProject
複製代碼
當一個項目裏面包含子模塊的時候,不只僅須要對父倉庫進行版本管理,子模塊目錄下也是存在版本的。那在不一樣的父倉庫下面如何進行子模塊的版本管理也成爲新的問題。
最簡單的辦法,就是主項目只專一使用子模塊的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
複製代碼
未完待續
參考文檔: