【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.mzph.cn/web/46766.shtml

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

相关文章

【SpringBoot】分页查询

1. Controller ApiOperation("分页查询")GetMapping("/page")public Result<PageResult> pageResultResult(EmployeePageQueryDTO employeePageQueryDTO) {System.out.println(employeePageQueryDTO.toString());PageResult pageResult employeeSer…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…

永远向有结果的人学习!

生活是一场漫长的旅程&#xff0c;充满了挑战和机遇。在这个过程中&#xff0c;我们不断地学习、成长&#xff0c;并从他人的经验中汲取智慧。今天&#xff0c;我想和大家分享一个重要的生活哲学&#xff1a;永远向有结果的人学习。 1. 敢于顶撞与撒野 我依旧敢和生活顶撞&am…

第二篇 Vue项目的搭建

1、脚手架安装 npm init vuelatest&#xff1a;官方提供的Vue项目脚手架工具&#xff0c;帮助我们搭建一个最简单的vue应用。 2、vs打开项目文件夹 打开脚手架生成的文件夹到vs并安装volar插件&#xff0c;以便vs能够支持vue格式代码 3、启动项目 npm run dev&#xff1a;vu…

国产麒麟、UOS在线打开pdf加盖印章

PageOffice支持两种电子印章方案&#xff0c;可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章&#xff08;全方位保护、防篡改、防伪造&#xff09;。Word和Excel的盖章功能请参考&#xff1a;Word和Excel加盖印章和签字功能 &#xff08;目前只支持win…

Java实现简易线程池

一.线程池的概念 创建Java线程需要给线程分配堆栈内存以及初始化内存&#xff0c;还需要进行系统调用&#xff0c;频繁地创建和销毁线程会大大降低系统的运行效率&#xff0c;采用线程池来管理线程有以下好处&#xff1a; 提升性能&#xff1a;线程池能独立负责线程的创建、维…

css - - - - - 去除图片默认的白色背景(混合模式 mix-blend-mode)

去除图片默认的白色背景&#xff08;mix-blend-mode&#xff09; 1. 需求描述2. 原图展示3. 原代码展示4. 使用混合模式(mix-blend-mode)5.修改后效果 1. 需求描述 图片含有白色地图&#xff0c;想要将其去掉 2. 原图展示 3. 原代码展示 <div><img src*****/> &…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源&#xff0c;可轻松替代电路中的各种标准器件&#xff0c;并按照客户要求组合成最优小型ASIC&#xff0c;缩短开发周期&#xff0c;降低成本。下面介绍LS98002现场可重构…

【Windows】操作系统之任务管理器(第一篇)

一、操作系统简介 Windows操作系统是由微软公司&#xff08;Microsoft&#xff09;开发的一款图形操作系统&#xff0c;它以其强大的功能和广泛的用户基础&#xff0c;成为了目前世界上用户使用最多、兼容性最强的操作系统之一。以下是关于Windows操作系统的详细介绍&#xff…

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

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

golang开发环境搭建与踩坑记录

文章目录 一、安装下载1、go环境2、ide 二、基本使用1、运行2、结构体与方法函数指针3、闭包4、指针5、map6、接口7、异常 三、包管理1、go mod语法2、项目下载所有依赖 一、安装下载 1、go环境 下载地址&#xff1a;https://go.dev/dl/ 或者&#xff1a;https://golang.goog…

python的with语句

1.with语句的作用 在 Python 中&#xff0c;with 语句用于创建一个上下文管理器&#xff0c;以更简洁和安全的方式管理资源。 其主要优点是可以确保在代码块执行完毕后&#xff0c;相关资源能够被正确释放或清理&#xff0c;即使在代码块内部发生了异常。 以下是一个使用 with…

【动态规划】力扣2266.统计打字方案数

Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。在这里插入图片描述 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i 次&#xff0c;i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 ‘s’ &#xff0c;Alice 需要按 ‘7’ 四次。…

LLM推理需要占用多少显存

搬运&#xff1a; AI开发者de频道&#xff1a;专题文章显示

c++一句话求前缀和,不用循环

partial_sum 是 C 标准库中的一个函数&#xff0c;用于计算给定范围内元素的部分和。它接受三个参数&#xff1a; 起始迭代器&#xff08;包含在计算范围内的第一个元素&#xff09;结束迭代器&#xff08;不包含在计算范围内的最后一个元素&#xff09;输出迭代器&#xff08…

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…

Linux中运用xsync实现免密集群分发

一、前言 今天搭建了三台虚拟机的集群&#xff0c;在集群中部分操作在三台虚拟机上的操作都一致&#xff0c;为了提高效率&#xff0c;就需要配置xsync实现集群分发。 二、设置免密登录 1.生成公钥和私钥 ssh-keygen -t rsa一直敲回车&#xff0c;会生成两个文件&#xff0c…

C#中处理Socket粘包

在C#中使用Socket进行网络通信时&#xff0c;粘包问题是常见的。粘包问题通常发生在TCP协议中&#xff0c;因为TCP是流式协议&#xff0c;数据可能会被分割成多个包发送&#xff0c;也可能多个小包会被合并成一个大包接收。 处理粘包问题的常见方法是使用消息分隔符或消息长度…

【Qt+opencv】ROI与图像混合

文章目录 前言ROIROI是什么如何提取ROI 图像混合整体混合线性混合 局部混合 总结 前言 在计算机视觉和图像处理中&#xff0c;我们经常需要对图像的某一部分&#xff08;也就是ROI&#xff0c;Region of Interest&#xff09;进行操作。这些操作可能包括滤波、缩放、旋转等。同…

SpringBoot 跨域请求处理全攻略:从原理到实践

文章目录 SpringBoot 如何处理跨域请求&#xff1f;你能说出几种方法&#xff1f;跨域请求概述跨域解决方案1. 使用CrossOrigin注解2. 使用WebMvcConfigurer配置类3. 使用过滤器&#xff08;Filter&#xff09;4. 使用Spring Security处理CORS5.使用Spring Cloud Gateway处理CO…