【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,一经查实,立即删除!

相关文章

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…

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现场可重构…

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…

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

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

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…

灵雀云AML:赋能金融AI,构建数智时代核心竞争力

在人工智能&#xff08;AI&#xff09;技术的迅猛发展中&#xff0c;金融行业正迈入变革的新时代。AI不仅在优化投资决策、信用评估、实时监控和欺诈识别方面展现出强大功能&#xff0c;还极大地提升了客户体验、降低了运营成本&#xff0c;并推动了产品创新。面对智能时代的挑…

C#知识|账号管理系统:多条件动态查询条件的编写。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在项目开发中涉及到许多通过多个条件勾选来实现动态的多个条件查询的情况&#xff0c; 此节记录多条件查询的后台代码编写&#xff0c;以下为学习笔记。 01 实现原理 通过界面输入框输入或者下拉框下拉选择任意查询…

《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part2_添加菜单

系列文章目录 Part1:启动RouYi 文章目录 系列文章目录Part1:启动RouYi 实现添加菜单功能来显示新的音图分析页面&#xff08;所截图片都是在已经添加菜单完成后的情况下&#xff09;一、建立一个菜单二、建立数据库1、通过数据库软件建立一个表&#xff0c;供我们使用&#xf…

【Ngix】快速上手,由浅入深

内容概述 1、nginx 简介 &#xff08;1&#xff09;介绍 nginx 的应用场景和具体可以做什么事情 &#xff08;2&#xff09;介绍什么是反向代理 &#xff08;3&#xff09;介绍什么是负载均衡 &#xff08;4&#xff09;介绍什么是动静分离 2、nginx 安装 &#xff08;1…

Leetcode - 周赛406

目录 一&#xff0c;3216. 交换后字典序最小的字符串 二&#xff0c;3217. 从链表中移除在数组中存在的节点 三&#xff0c;3218. 切蛋糕的最小总开销 I 四&#xff0c;3219. 切蛋糕的最小总开销 II 一&#xff0c;3216. 交换后字典序最小的字符串 本题要求交换一次相邻字符…

大数据架构对比记录

Lambda架构 -维护两套项目&#xff0c;开发和维护成本高 -两套链路&#xff0c;数据容易不一致 -数据计算成本大&#xff08;例如原定每小时计算一次&#xff0c;但有额外新需求需要计算两点半-三点半之间数据&#xff0c;则需要重新计算&#xff09; Kappa -过于依赖kafka消…

FPGA:基于复旦微FMQL10S400 /FMQL20S400 国产化核心板

复旦微电子是国内集成电路设计行业的领军企业之一&#xff0c;早在2000年就在香港创业板上市&#xff0c;成为行业内首家上市公司。公司的RFID芯片、智能卡芯片、EEPROM、智能电表MCU等多种产品在市场上的占有率位居行业前列。 今天介绍的是搭载复旦微 FMQL10S400/FMQL20S400的…

01数据结构 - 顺序表

这里是只讲干货不讲废话的炽念&#xff0c;这个系列的文章是为了我自己以后复习数据结构而写&#xff0c;所以可能会用一种我自己能够听懂的方式来描述&#xff0c;不会像书本上那么枯燥和无聊&#xff0c;且全系列的代码均是可运行的代码&#xff0c;关键地方会给出注释^_^ 全…

C++客户端Qt开发——常用控件(容器类控件)

6.容器类控件 ①GroupBox 带标题分组框 属性 说明 title 分组框的标题 alignment 分组框内部内容的对齐方式 flat 是否是"扁平"模式 checkable 是否可选择 设为true,则在title前方会多出一个可勾选的部分. check 描述分组框的选择状态&#xff08;前提…