是什么?
submodule子模塊,簡單來講就是Git倉庫中的子倉庫。
想一想是不是遇到過這樣的情況,有一個模塊是通用的,需要被使用到多個項目;或者你的項目中要使用github上的一個開源模塊。這樣的模塊要怎么在你的項目中保持同步更新甚至是提交呢?答案就是submodule。
怎么用?
1. 新增submodule
git submodule add $giturl $foldername
其中$giturl表示git倉庫地址,$foldername表示submodule的目錄名,例如:
git submodule add git://github.com/xx/A.git A
注:下面示例全部以 A 當(dāng)做submodule所在目錄
完成后,將文件變化提交即可。
2. clone有submodule的git倉庫
git clone $giturl
git submodule init
git submodule update
3. submodule A作者有更新,如何同步到我的項目?
-
更新submodule A
cd A git pull -
回到主git倉庫,查看狀態(tài),并提交
cd .. git status //輸出結(jié)果有這樣的內(nèi)容,意思是submodule A有修改。add并提交即可 modified: A (new commits) git add . git commit -m 'update submodule' git push -
你的同事或者協(xié)作的開發(fā)者,如何更新?
git pull git submodule update
這個些操作和status的內(nèi)容一開始可能很難理解,這里要講一下關(guān)于submodule的設(shè)計理念:
- 主git倉庫中存在
.gitmodules文件,它記錄了submodule的基本信息。例如remote地址。 - 同時在某處記錄了主git倉庫所用的submodule的commit號。
- 主git倉庫并不同步submodule中的所有代碼,而是同步其remote地址和commit號,每個clone都是根據(jù)這兩個信息自行到remote地址獲取到該commit版本的內(nèi)容。
所以,如果你要更新submodule必須做上面的操作步驟。而你操作完成后,你的git倉庫中submodule的commit號得到更新。這樣,與你協(xié)作的開發(fā)者,就可以直接git pull得到最新的submodule commit號,git submodule update獲取submodule該commit的代碼。
4. 我是主git倉庫的開發(fā)者,同時也是submodule A的作者,如何在主git倉庫修改A并同步?
如果你理解了上面說的設(shè)計理念,那么這個操作非常簡單。
修改A目錄中的內(nèi)容
-
提交并同步A
cd A git add . git commit git push 此時,你就處于3.2的狀態(tài),按照3.2操作即可。
5. 幾個submodule都想更到最新
有個簡便操作
git submodule foreach git pull
這樣所有submodule都更到最新了,add commit即可。