git子模块简介

问题背景

随着公司业务线的增加,不同的业务线不可避免的有些相似,甚至相同的逻辑,比如营销方略下有营销概览,数据中心下也有一个同样的营销概览模块,以后可能直投下也会添加一个类似的模块。它们的数据来源是相同的,交互也是大同小异。每个业务线都copy一遍代码,造成了大量的代码冗余,且后续修改也要挨个进行一遍,所以这显然不是一个好办法。
本文要介绍的git子模块,就是解决这个问题的一个方案,希望能够抛砖引玉。

git子模块定义

子模块允许你将一个Git仓库作为另一个Git仓库的子目录。
它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
子模块适用于主项目对子模块有依赖关系,却又并不关心子模块的内部开发的流程和细节;适用于整体复用的情况;
比如我上面描述的问题背景,就是典型的案例,营销方略主模块不关心营销概览子模块的实现,流程只要和数据中心保持一致即可;
下面以这个需求为例,分别简单介绍一下submodule和subtree的使用;

已知,子模块的项目地址是:https://xxx.com/ads-fe/marketing-overview-submodule.git
使用子模块的主项目是:https://xxx.com/ads-fe/jzt-strategy.git

git submodule

首先介绍一下submodule的使用。

添加子模块

进入主项目所在目录,添加子模块到指定目录下:

 //语法: git submodule add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]  
 git submodule add https://xxx.com/ads-fe/marketing-overview-submodule.git  src/Overview

执行完添加后,页面会多出2个子目录,如图所示:


添加

除了这2处外,.git目录下也有变化,用于记录子模块的变更记录:


gitmodule

协同开发的问题

当有协同人员开发人员同一项目时需要拉取代码:

git clone https://xxx.com/ads-fe/jzt-strategy.git
gitclone

注意:此时目录是空的,需要执行以下代码:

  git submodule init
  git submodule update

子模块拉取最新代码

git submodule update --remote src/Overview 

//更新多个子模块
git submodule foreach 'git pull origin master'

删除子模块

当需求变动或者添加错误的时候,需要删除子模块:

 git submodule deinit  -f  src/Overview

上述命令删除的只是src/Overviews下的文件,此时,这些文件仍然存在,需要删除.git/module/src/Overview下的内容和修改.gitmodules


rm

git subtree

使用subtree,同样可以实现在一个项目中引用其他项目的数据;但是和submodule方式不同的是,使用subtree外部的版本库会作为一个目录被整个复制到本版本库中,并且复制到本版本库中的子目录下的数据可以和原版本库数据建立跟踪关联。

添加子模块

使用下面的代码把子仓库的地址作为一个remote,方便记忆;

git remote add  MarketingOverview https://xxx.com/ads-fe/marketing-overview-submodule.git

此时,git config文件会多出一条记录:

[remote "MarketingOverview"]
    url = https://xxx.com/ads-fe/marketing-overview-submodule.git
    fetch = +refs/heads/*:refs/remotes/MarketingOverview/*

拉取子模块代码
进入主项目所在目录,执行:

//语法:git subtree add  --prefix=<prefix> <repository> <ref>
git subtree add --prefix=src/Overview MarketingOverview master –squash

添加之后的src/Overview就是主项目jzt-strategy的一个普通文件夹,如果这时候jzt-strategy内容更新之后,正常git push即可,子项目对于主项目来说完全是透明的。

子模块拉取最新代码

git subtree pull --prefix=src/Overview MarketingOverview master --squash

删除子模块

删除subtree,直接删除子模块所在的目录即可,没有残留文件需要单独清理;

git rm -rf src/Overview/

补充

上面介绍了2种子模块的增加和删除功能,但是没有介绍修改后的操作,主要是我认为这里的使用场景是多业务线完整复用的场景,如果差异过多,需要自己单独的模块,就失去了复用的意义了。当然这并不代表修改功能不能使用,感兴趣的小伙伴可以去了解一下,这里就不赘述了。

submodule vs subtree

subtree优点:

  • subtree相比submodule操作更简单;无论添加还是删除,都少了很多步骤;
  • 不增加任何像.gitmodule这样的新的元数据文件;
  • git subtree对于项目中的其他成员透明,意味着可以不知道git subtree的存在

submodule优点:

  • git submodule在本地可以存在多个git代码仓库
  • git subtree只有一个代码库,也就是说在项目内部依赖外部独立项目的时候,是完全无感知的操作。

子模块存在的问题

有些组件,方法或者常量定义,可能另一个子模块也在使用,
比如ajax请求,本着尽量少配置和少依赖的原则,子模块一般会有自己封装的ajax方法,因为此时不能默认主项目也一定有ajax请求,如果引用多个子模块,
每个模块都有自己的ajax方法,这就造成了一定程度的代码冗余;

考虑方案:

  • 提取公共组件
  • 常量及公共方法,可以单独发布一个工具包引入
  • 常量及公共方法再作为一个子模块引入

总结

大家可以根据实际情况进行选择使用,如果只是依赖一个模块,subtree可能更简单一些,如果主项目依赖多个子项目,submodule才是最好的选择。

参考:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容

  • 目录 建立仓库1.1 创建主仓库1.2 创建子仓库 提交内容2.1 提交到主工程的仓库2.2 提交到子模块的仓库 ...
    SunnyZhou1024阅读 1,122评论 1 5
  • 简述 在开发中,稍微复杂一点的项目都会有多个功能模块,大致结构可能是这样 project |--moduleA |...
    思无涯1993阅读 5,740评论 0 2
  • git子模块的使用 git子模块可以用于项目包含另一个项目的情况,也许是第三方库或被多个项目引用的基础框架。此次学...
    看似平淡阅读 3,007评论 0 0
  • 在一个项目中使用另一个项目,两个项目分别有各自的仓库以及各自的维护周期 添加外部项目为子模块 文档参考 .6 Gi...
    钱英俊真英俊阅读 1,356评论 0 2
  • 添加公共的库到当前项目中 添加submodule 子模块添加成功后当前项目会多一个.gitmodules隐藏文件,...
    节奏lhl阅读 351评论 0 0