簡述
在開發(fā)中汹粤,稍微復(fù)雜一點的項目都會有多個功能模塊窟蓝,大致結(jié)構(gòu)可能是這樣
project
|--moduleA
|--submoduleC
|--submoduleD
|--moduleB
同時,模塊A可能被project2偏形、proejct3等多個項目使用,project和ABCD各個模塊可能在不同的git倉庫中,這時膏斤,就需要使用git的的模塊功能,目前git提供的子模塊功能主要有
submodule和subtree兩種邪驮。
submodule
初始化項目目錄
mkdir root
cd root
git init
mkdir region
cd region
git init
增加三個子模塊 ModuleA ModuleB ModuleC
git submodule add -b ResourceEvaluate http://scm.lsf.com/bitbucket/scm/lsf/ModuleB.git ModuleB
git submodule add http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/ModuleB_backend_ModuleA.git ModuleA
git submodule add http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/nzy_region_resourceevaluation.git ModuleC
執(zhí)行以上命令后會生成.gitmodule的文件莫辨,文件存儲子模塊信息,格式大致如下
[submodule "ModuleB"]
path = ModuleB
url = http://scm.lsf.com/bitbucket/scm/lsf/ModuleB.git
branch = ResourceEvaluate
[submodule "ModuleA"]
path = ModuleA
url = http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/ModuleB_backend_ModuleA.git
[submodule "ModuleC"]
path = ModuleC
url = http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/nzy_region_resourceevaluation.git
之后提交.gitmoduley文件
git commit -m 'add submodule '
git push
以上完成子模塊的增加
檢出
git clone http:/scm.ModuleB.com/bitbucket/scm/~sifan.liu/region.git
檢出后各模塊內(nèi)容為空目錄毅访,需要執(zhí)行
git submodule init
注冊各子模塊與遠(yuǎn)程倉庫的關(guān)系
git submodule update --remote
更新所有模塊
Note:更新后每個子模塊并非在指定分支上沮榜,而是關(guān)聯(lián)最近一次commitID
git submodule foreach git checkout master
切換到所有master分支上(ModuleB為ResourceEvaluate,暫時需要單獨執(zhí)行)
其余所有操作可單獨在各個模塊上執(zhí)行喻粹。
subtreee
增加遠(yuǎn)程倉庫并設(shè)置引用名蟆融,此步可省略,主要是為了簡化后面的操作
git remote add ModuleA http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/ModuleB_backend_ModuleA.git master
git remote add ModuleA http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/ModuleB_backend_ModuleA.git master
通過subtree添加子模塊,--squash可省略磷斧,其功能是只有最新的提交記錄被引入振愿,去掉后則是引入所有歷史提交記錄
git subtree add --prefix=ModuleA --squash ModuleA master
更新
git subtree pull -P ModuleA ModuleA master
提交
git subtree push --prefix=ModuleA ModuleA master
SubModule與SubTree的差異
- 核心區(qū)別
git submodule類似于引用捷犹,而git subtree類似于拷貝,比如你在一篇博客中想用到你另一篇博客的內(nèi)容冕末,git submodule是使用那篇博客的鏈接萍歉,而git subtree則是將內(nèi)容完全copy過來。
2档桃、優(yōu)劣
| submodule | subtree | 結(jié)果
----|----|----|----
遠(yuǎn)程倉庫空間占用 |submodule只是引用枪孩,基本不占用額外空間|子模塊copy,會占用較大的額外空間|submodule占用空間較小藻肄,略優(yōu)
本地空間占用 | 可根據(jù)需要下載|會下載整個項目|所有模塊基本都要下載蔑舞,二者差異不大
倉庫克隆|克降后所有子模塊為空,需要注冊及更新嘹屯,同時更新后還需切換分支|克隆之后即可使用|submodule步驟略多攻询,subtree占優(yōu)
更新本地倉庫|更新后所有子模塊后指向最后一次提交,更新后需要重新切回分支州弟,所有子模塊只需一條更新語句即可|所有子模塊需要單獨更新|各有優(yōu)劣钧栖,相對subtree更好用一些
提交本地修改|只需關(guān)心子模塊即可,子模塊的所有操作與普通git項目相同|提交執(zhí)行命令相對復(fù)雜一些|submodule操作更簡單婆翔,submodule占優(yōu)
目前其他地方還未用到拯杠,期望各位補充