是什么毫深?
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即可禁偎。