打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
git子模块使用之git submodule与 git subtree比较

简述

在开发中,稍微复杂一点的项目都会有多个功能模块,大致结构可能是这样
project
 |–moduleA
  |–submoduleC
  |–submoduleD
 |–moduleB
同时,模块A可能被project2、proejct3等多个项目使用,project和ABCD各个模块可能在不同的git仓库中,这时,就需要使用git的的模块功能,目前git提供的子模块功能主要有
submodule和subtree两种。

submodule

初始化项目目录

mkdir rootcd rootgit initmkdir regioncd regiongit init
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

增加三个子模块 ModuleA ModuleB ModuleC

git submodule add -b ResourceEvaluate http://scm.lsf.com/bitbucket/scm/lsf/ModuleB.git ModuleBgit submodule add http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/ModuleB_backend_ModuleA.git ModuleAgit submodule add http://sifan.liu@scm.ModuleB.com/bitbucket/scm/nic/nzy_region_resourceevaluation.git ModuleC
  • 1
  • 2
  • 3

执行以上命令后会生成.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

之后提交.gitmoduley文件

git commit -m 'add submodule 'git push
  • 1
  • 2

以上完成子模块的增加

检出

git clone http:/scm.ModuleB.com/bitbucket/scm/~sifan.liu/region.git
  • 1

检出后各模块内容为空目录,需要执行

git submodule init
  • 1

注册各子模块与远程仓库的关系

git submodule update --remote
  • 1

更新所有模块

Note:更新后每个子模块并非在指定分支上,而是关联最近一次commitID

git submodule foreach git checkout master 
  • 1

切换到所有master分支上(ModuleB为ResourceEvaluate,暂时需要单独执行)
其余所有操作可单独在各个模块上执行。

subtreee

增加远程仓库并设置引用名,此步可省略,主要是为了简化后面的操作

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  
  • 1
  • 2

通过subtree添加子模块,–squash可省略,其功能是只有最新的提交记录被引入,去掉后则是引入所有历史提交记录

git subtree add --prefix=ModuleA --squash  ModuleA master
  • 1

更新

git subtree pull -P ModuleA ModuleA master
  • 1

提交

git subtree push --prefix=ModuleA ModuleA master
  • 1

SubModule与SubTree的差异

  1. 核心区别
    git submodule类似于引用,而git subtree类似于拷贝,比如你在一篇博客中想用到你另一篇博客的内容,git submodule是使用那篇博客的链接,而git subtree则是将内容完全copy过来。

2、优劣

/ submodule subtree 结果
远程仓库空间占用 submodule只是引用,基本不占用额外空间 子模块copy,会占用较大的额外空间 submodule占用空间较小,略优
本地空间占用 可根据需要下载 会下载整个项目 所有模块基本都要下载,二者差异不大
仓库克隆 克降后所有子模块为空,需要注册及更新,同时更新后还需切换分支 克隆之后即可使用 submodule步骤略多,subtree占优
更新本地仓库 更新后所有子模块后指向最后一次提交,更新后需要重新切回分支,所有子模块只需一条更新语句即可 所有子模块需要单独更新 各有优劣,相对subtree更好用一些
提交本地修改 只需关心子模块即可,子模块的所有操作与普通git项目相同 提交执行命令相对复杂一些 submodule操作更简单,submodule占优

目前其他地方还未用到,期望各位补充

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Git Submodule管理项目子模块
python 模块相互import
深入理解Java的Spring框架中的IOC容器
当一个模块被引入两次时,会发生什么?
extern C的作用详解
extern “C”的作用详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服