【Git】Git Submodules 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)

Git Submodules 介绍

  • 1、为什么你值得读这篇文章?
  • 2、为什么有 submodules?
  • 3、了解 Git Submodules
    • 3.1、如何让一个Git仓库变为另一个Git仓库的 submodule
    • 3.2、submodule 的父子关系存在哪里
      • 3.3、submodule 的父子关系信息怎么存
  • 4、submodule 开发常用操作
    • 4.1、添加子模块
    • 4.2、实际开发操作
      • 4.2.1、将远端包含有子模块的代码克隆下来
      • 4.2.2、建分支操作
      • 4.2.2、子模块开发合并到develop/test
      • 4.2.2、子模块和父模块开发合并到master
  • 5、总结

1、为什么你值得读这篇文章?

  • 一些技术博客写的很详细,但不适合新人学习。

  • 官方文档很全面,适合了解详细命令,但主次不分明。

本文会根据我的大量的 submodules 实践经验(包括工作和个人开发),只解释常用的命令。当你了解这些命令,你完全可以像我一样使用 Git Submodules。

2、为什么有 submodules?

  1. 解决公共代码问题。如果某些文件,在项目A和项目B中都会用到,例如组件库,那么这些文件可以作为 submodules 来管理,减少重复代码。(当然,该场景下npm包是另一解决方案,你需要选择一种方案。)

  2. 解决团队维护难题。如果一个大项目是一个大 Git 仓库,需要统一编译,不同的模块由不同团队维护,放在同一个 Git 仓库有诸多难处:例如多个团队的 MR 混在一起、权限难以区分等。这种情况即使公司内网 Git 权限做的足够精细,仓库管理员的学习成本也会很高,很难深度使用这种高级功能。为了解决多团队维护的难题,Git Submodules 也能大展身手,它可以让每个团队负责的模块就是一个 Git 仓库,这些 Git 仓库都被包含在同一个主 Git 项目下。(当然,微前端、微服务是另一种解决方案,你需要选择一种方案。)

3、了解 Git Submodules

有2个概念:主项目submodule(子模块)。这两者各自都是完整的 Git 仓库。

3.1、如何让一个Git仓库变为另一个Git仓库的 submodule

  1. 创建Git仓库A。
  2. 创建Git仓库B。
  3. 在Git仓库A中,通过git submodule add ...(仓库B的地址,即git clone时后面那串东西),可以把仓库B当作仓库A的submodule,此时A就成了主项目。【注:B也可以做A的主项目,通过在仓库B执行git submodule add ...(A地址)即可,因为二者都是完整Git仓库,在建立父子关系前,没有差异的。】

注意事项

  • 执行操作后,会在当前父项目下新建个文件夹,名字就是 submodule 仓库的名字。这个文件夹里面的内容,是 submodule 对应 Git 仓库的完整代码

  • 如果你希望换个名字,或者换个路径(例如放在某个更深的目录下),也是允许的,需要后面增加个路径参数,例如git submodule add ...(仓库地址) src/B(你希望 submodule 位于的文件夹路径)

3.2、submodule 的父子关系存在哪里

关系是保存在主项目的 Git 仓库中。

被当作 submodule 的 Git 仓库,其实不知道自己变成了 submodule,它更不知道爸爸们有谁。(意思是,当你打开某个被当作 submodule 的 Git 仓库首页时,或者拉下这个仓库时,没有任何痕迹表明它是个submodule。因为父子信息不存在这里,只存在爸爸那里。)

3.3、submodule 的父子关系信息怎么存

.gitmodules 文件

父子关系的信息保存在主项目的.gitmodules文件,如果不是新加 submodule,这个文件通常不必改变了,因为信息比较固定。

这个文件中主要记录了子模块的url,如果添加的时候使用的ssh链接,那这个url就是ssh,如果是https链接,这个url就是https

在这里插入图片描述

submodule 的版本号

主项目还保存了对应 submodule 的版本号(commit id),没有冗余存储 submodule 的代码。

可以看到,这其实是个跳转到另一个仓库的链接,指明了具体的 commit id。

这个版本号,是需要经常变更的。

在这里插入图片描述

4、submodule 开发常用操作

4.1、添加子模块

在github中创建了三个项目,其中git-learn为主项目,git-learn-submodules1和git-learn-submodules2为子项目
在这里插入图片描述

将git-learn克隆到本地,然后执行git submodule add ...(仓库B的地址,即git clone时后面那串东西)添加子模块到git-learn中

在这里插入图片描述
本地项目文件夹下面就多出来了两个文件夹(两个子项目)和一个文件(.gitmodules)

在这里插入图片描述
这是git上的目录,其中两个字模块用hash commit来维护,指向的是两个子仓库的地址

在这里插入图片描述

点击就跳转到对应子模块的目录:

在这里插入图片描述

到此,子模块初始化完成,接下来模拟实际工作场景

4.2、实际开发操作

4.2.1、将远端包含有子模块的代码克隆下来

git clone --recurse-submodules <主仓库url>

如:https://github.com/your-username/your-repository.git

在这里插入图片描述

4.2.2、建分支操作

下面以idea操作为例,使用idea打开git-learn文件夹

实际开发分为,develop、test、prod、master、feature、release和hotfix等,我们模拟简单建一下

在这里插入图片描述
从main新建一个prod分支,然后推送到远端,develop和test类似

建完后如下图:

在这里插入图片描述

4.2.2、子模块开发合并到develop/test

当我们要开发时,从最新的master新建一个feature分支,要注意的是,我们开发哪个模块,就只需要新建哪一个模块的feature就行,其他可以不用动

在这里插入图片描述
例如:我要开发git-learn-submodules1模块,从master新建一个feature/0716-xxxx分支

在这里插入图片描述
在这里插入图片描述
其中,git-learn-submodules1分支在feature/0716-xxxx分支,git-learngit-learn-submodules2在master分支

现在对git-learn-submodules1文件进行修改

在这里插入图片描述

提交修改,推送到远端开发分支

在这里插入图片描述
在这里插入图片描述

推送成功后,你的feature分支中就有了记录

在这里插入图片描述
现在,需要将你的代码,合到develop或者test分支,以develop为例

本地仓库切到develop分支,并且更新最新的develop代码(跟新最新代码,可以避免冲突):

在这里插入图片描述

merge最新的开发代码到develop环境中

在这里插入图片描述

成功以后develop会出现绿色小箭头,然后推送到远端仓库

在这里插入图片描述

在这里插入图片描述
这样你的开发环境中,就是最新的代码了,test同理

在这里插入图片描述

4.2.2、子模块和父模块开发合并到master

在这里插入图片描述

修改子模块和父模块

在这里插入图片描述

这个时候会出现下面情况

在这里插入图片描述
common-api.jsonsub1.txt是我们修改的文件是因为git-learn-submodules1子文件的hash不一致出现的问题(最新hash在develop,我们现在处与feature/0716-xxxx分支)

这种情况,我们先提交模块分支

在这里插入图片描述
然后推送到远端的feature/0716-xxxx分支

在这里插入图片描述
一般开发,没有合master权限,需要请求合并分支

在github (gitlab同理) 中子模块目录发起合并master请求

在这里插入图片描述

完成merge

在这里插入图片描述
这个时候,你的远端master上的git-learn-submodules1是最新的,需要拉到本地仓库,这个时候本地master就是最新的了

在这里插入图片描述
然后提交公共模块

在这里插入图片描述
然后按照同样的方法去发起merge请求操作。

到此,合并完成

5、总结

画了一个流程图,加深印象

在这里插入图片描述

通过官方文档,你可以了解到更多场景,但是我从来没使用过其它场景了,因为用不到。本文描述的完全满足了我所有日常使用场景。

而高级场景会导致协作变困难,因为不是所有开发者都懂这些更复杂的命令和配置

英文文档:https://www.git-scm.com/book/en/v2/Git-Tools-Submodules
中文文档:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

GitHub地址:https://github.com/huang-hanson/git-learn

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/379828.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第30天 | MindNLP ChatGLM-6B StreamChat

今天是第30天&#xff0c;学习了MindNLP ChatGLM-6B StreamChat。 今天是参加打卡活动的最后一天&#xff0c;经过这些日子的测试&#xff0c;昇思MindSpore效果还是不错的。 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;具有62亿参数&#xff0c;基于 …

vue3前端开发-小兔鲜项目-人气推荐栏目的前端渲染

vue3前端开发-小兔鲜项目-人气推荐栏目的前端渲染&#xff01;今天和大家分享一下&#xff0c;人气推荐栏目的前端页面如何渲染内容。 经历过上一次的&#xff0c;新鲜好物的栏目渲染之后&#xff0c;我们已经熟练了&#xff0c;vue3的接口调用&#xff0c;数据渲染到页面中的整…

【Android安全】Ubuntu 下载、编译 、刷入Android-8.1.0_r1

0. 环境准备 Ubuntu 16.04 LTS&#xff08;预留至少95GB磁盘空间&#xff0c;实测占94.2GB&#xff09; Pixel 2 XL 要买欧版的&#xff0c;不要美版的。 欧版能解锁BootLoader、能刷机。 美版IMEI里一般带“v”或者"version"&#xff0c;这样不能解锁BootLoader、…

acwing796-子矩阵的和-前缀和

s矩阵是全局变量&#xff0c;维度n*m,从1~n和 1~m存储元素【0】【0】~【0】【m】和【0】【0】~【n】【0】分别存储的都是0.s矩阵刚开始是存储输入的元素&#xff0c;后面用于存储前缀和。 s矩阵的意思是s【i】【j】表示从【0】【0】到【i】【j】为对角线的矩阵里面所有元素的和…

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…

Unity XR Interaction Toolkit的安装(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、安装1.打开unity项目2.打开包管理器&#xff08;PackageManage&#xff09;3.导入Input System依赖包4.Interaction Layers unity设置总结 前言 安装前请注意&#xff1a;需要…

JVM(day2)经典垃圾收集器

经典垃圾收集器 Serial收集 使用一个处理器或一条收集线程去完成垃圾收集工作&#xff0c;更重要的是强调在它进行垃圾收集时&#xff0c;必须暂停其他所有工作线程&#xff0c;直到它收集结束。 ParNew收集器 ParNew 收集器除了支持多线程并行收集之外&#xff0c;其他与 …

Redis 关于内存碎片的解决方法

今天生产机报内存爆满异常被叫过去查看问题&#xff0c;通过各种排除最终定位到了Redis的内存碎片的问题&#xff0c;这篇博客将详细介绍Redis内存碎片问题并给出最佳实践解决此问题。 Redis的内存碎片原理 先引用Redis官方的原话&#xff1a; 当键被删除时&#xff0c;Redis …

类和对象(二)

默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。 C有六个默认成员函数&#xff0c;不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;最重要的是前4个&#xff0c;最后两个了解⼀下即可。另外&#xff…

Java垃圾收集器选择与优化策略

1.垃圾收集算法有哪些,可以聊一下吗? 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾。 1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾。如果一个对象没有任何指针对其引用,它就是垃圾。 弊端:如果…

成像光谱遥感技术中的AI革命:ChatGPT

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力&#xff0c;ChatGPT在遥感中的应用&#xff0c;人工智能在…

LeetCode 232.用栈实现队列 C写法

LeetCode 232.用栈实现队列 C写法 思路&#x1f9d0;&#xff1a; 栈代码在本篇中。与队列实现栈类似&#xff0c;不过这里我们建立两个栈&#xff0c;一个栈专门存放入队数据&#xff0c;一个专门存放出队数据&#xff0c;不需要再来回导数据。原理在于一个栈的数据到另一个栈…

安卓逆向入门(2)------Xpose初级

项目配置 在AndroidMainfest.xml中添加 <meta-dataandroid:name"xposedmodule"android:value"true" /><meta-dataandroid:name"xposeddescription"android:value"Xposed模块初体验" /><meta-dataandroid:name"xp…

python爬虫获取网易云音乐评论歌词以及歌曲地址

python爬虫获取网易云音乐评论歌词以及歌曲地址 一.寻找数据接口二.对负载分析三.寻找参数加密过程1.首先找到评论的请求包并找到发起程序2.寻找js加密的代码 四.扣取js的加密源码1.加密函数参数分析①.JSON.stringify(i0x)②bse6Y(["流泪", "强"])③bse6Y…

算法日记day 11(KMP算法)

一、KMP算法 基本原理&#xff1a; KMP算法&#xff08;Knuth-Morris-Pratt算法&#xff09;是一种用于在一个文本串&#xff08;字符串&#xff09;中查找一个模式串&#xff08;子串&#xff09;的高效算法。它的主要优点是在匹配过程中避免了回溯&#xff08;backtracking…

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

cleanshot Mac 上的截图工具

笔者闲来无事&#xff0c;最近在找一些mac上好用的工具其中一款就是cleanShot。为什么不用原有的mac自带的呢。因为相对来说编辑功能不算全面&#xff0c;不支持长截图。那有没有一款软件支持关于截图的好用工具呢。 所以笔者找了这款。安装包是直接安装就可使用的。请大家点赞…

MATLAB quiver矢量图 设置colorbar

给三维矢量图按照不同高度设置箭头颜色 figure clf X surfaceuz(:,1); Y surfaceuz(:,2); Z surfaceuz(:,3); hold onzcolor jet; % qquiver3(X,Y,Z,X,Y,W) for i 1:length(surfaceuz)quiver3(X(i),Y(i),Z(i),X(i),Y(i), Z(i),...Color,zcolor(floor((Z(i) - -0.1) * 2…

【Linux学习】常用基本指令

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 &#x1f525;Linux下常用基本指令ls指令pwd指令cd指定touch指令…

【JVM基础02】——组成-程序计数器解读

目录 1- 引言&#xff1a;程序计数器1-1 程序计数器是什么&#xff1f;为什么用程序计数器&#xff1f;(What)(Why) 2- 核心&#xff1a;程序计数器的原理&#xff08;How&#xff09;2-1 使用 javap 查看程序计数器的作用2-2 多线程下程序计数器原理举例 3- 小结&#xff1a;什…