在開發大型專案的過程中,一定會套用一些第三方的子專案,但又希望子專案更新時,主要專案又同時更新

當然這種狀況用git可以解決,但是主要專案及子專案都有.git,會有大大的問題

好險git有提供Git Submodule來解決這樣的問題

簡單說就是將某個有做git的專案放進另一個有做git的專案裡

引入Submodule
比如說,我有個專案

project
	.git
	index.php

而我需要引用到一個jQuery plugin,就可以利用git submodule來引入

#使用方法:git submodule add origin dir_name
#注意:原本的專案中不可以先建立dir_name(資料夾名稱),不然會無法add
git submodule add git@github.com:johnson4932/jQuery-plugin.git jQuery_plugin

這時候就可以發現project目錄下多出一個.gitmodules檔案,parent git與submodule git的關連性記錄在.gitmodules中,而版本控制則是靠parent git記住submodule git的commit id

所以這時候做git status會看到

#parent git只認submodule git的commit id
new file:   .gitmodules
new file:   jQuery_plugin

接著要讓parent git知道你有掛入modules(讓.git/config有submodule的資訊,其實跟git add file的意思相同)

git submodule init

接下來只要像一般專案一樣,先add完後commit再push上去即可

git add .gitmodules jQuery_plugin
git commit -m "add submodule"
git push git@github.com:johnson4932/project.git master

更新Submodule
如果Submodule有更新,只要移動到Submodule目錄,做pull就可以了

cd jQuery-plugin
git pull git@github.com:johnson4932/jQuery-plugin.git
#回到parent git commit
git add jQuery-plugin
git commit -m "submodule update"

clone parent git
當我們clone有submodule主專案下來時,會發現只有parent git的程式,而submodule竟然是空的,只剩.gitmodules還在。
這時要先更新.git/config後再去拉submodule(簡單說單純clone下來的話,parent git是不認submodule的)

#在.git/config 中加入 submodule 設定
git submodule init
#把整個submodule clone 下來
git submodule update
Categories: Git