git submodule子模块的使用

news/2024/9/17 9:41:21/ 标签: git

子模块的使用

添加子模块

  1. 添加子模块

    git submodule add <子仓库URL> <子仓库路径>

    例子: git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco

  2. 若子模块存在好几个分支,可以在添加子模块时,指定分支

    git submodule add -b <分支名> <子仓库URL> <子仓库路径>

    例子:git submodule add -b build_V1.9.4_ar9341 http://192.168.100.181/guideir/poco.git 3rdparty/poco

    执行此命令后可以在 .gitmodules 文件中看到如下配置:

    [submodule "poco"]path = 3rdparty/pocourl = http://192.168.100.181/guideir/poco.gitbranch = build_V1.9.4_ar9341
    

下载子模块

使用 git clone 下载代码时,如果使用普通的 git clone来克隆项目,会发现项目的子模块文件夹中内容为空

可以使用以下两种方式来克隆子项目:

  1. 克隆主项目时候,使用 git clone --recurse-submodules <主仓库URL> 递归克隆子模块

    例子:git clone --recurse-submodule https://gitee.com/oweni/config-test.git

    git clone --recurse-submodule是 Git 2.13 版本引入的,为了提高命令的可读性。在之前的版本中,可以使用git clone --recursive`指令,无论是哪种写法,都会递归地克隆主仓库及其所有子模块

  2. 若已经克隆完成主项目,但是此时子模块文件夹为空,可以在主仓库目录中使用 git submodule update --init指令下载子模块

    例子:

    1. 下载主仓库代码: git clone https://gitee.com/oweni/config-test.git
    2. 在主仓库目录使用: git submodule update --init 或者 git submodule update --init --recursive 递归下载子模块
  3. 若已经下载完成子模块,发现子模块不是最新代码,可以在主仓库目录使用: git submodule update --remote 或者 git submodule update --remote --recursive 指令将子模块更新到子模块的最新节点;

    注意git submodule update 是将子仓更新到主仓库当前引用的节点,注意,主仓库当前引用的节点,并不一定是子仓库的最新节点;而git submodule update --remote是将子仓库更新到子仓库的最新节点,所以通常在执行完git submodule update --remote指令后,也许主仓库会提示子仓库有新提交,此时在父仓库中add + commit + push当前改动,将主仓库引用的子仓库节点更新到最新

修改子模块代

1.正常情况,进入子仓库,使用git status 查看当前是否处于某个分支,如果是处于正常的分支,那么可以直接进行添加和提交,和普通的提交流程一样

$ git add .
$ git commit -m "commit"
$ git push origin master

2.异常情况,如果进入子仓库,发现子仓库的状态为 头指针分离于 XXXX(commit id),此时有两种解决方案提交:

方案一

1.使用 git addgit commit来添加和提交修改到本地

git add <change files>
git commit -m "fix some bugs"

2.推送修改到子仓库的远端,在头指针分离的情况下,如下提交:

git push origin HEAD:master
//推送当前修改到远端的master分支上

3.回到父仓库中,提交对子模块的更新

cd ..	//回到上级目录(父仓库)
git add son  //son为子仓库的目录
git commit -m "update son submodule"
git push origin master
方案二

解决方法是:在子模块中先git checkout master,然后在git merge <detached branch name/number>,最后git push -u origin master即可。如图:
在这里插入图片描述

解释下出现 头指针分离的原因:

这里有个概念,就是主repo中的子模块被拉到本地时默认是一个子模块远程仓库master分支的detached branch。这个分支是master的拷贝,但它不会被推送到远端。如果在子模块中做了修改,并且已经addcommit,那你会发现当你想要push的时候会报错:Updates were rejected because a pushed branch tip is behind its remote。这便是所谓的detached branch的最直接的体现。

删除子模块

使用git submodule deint指令来删除子模块

提供一个例子,删除trunk/3rdparty/ffmpeg子模块,之后再引入trunk/3rdparty/ffmpeg子模块

1.git submodule deinit -f trunk/3rdparty/ffmpeg,删除 trunk/3rdparty/ffmpeg子模块

​ 此时本地代码目录trunk/3rdparty/ffmpeg中的代码会被删除,但是此文件夹会存留

2.手动删除.git/modules/目录中相关子模块的文件夹

rm -rf .git/modules/trunk/3rdparty/ffmpeg/

3.执行git rm trunk/3rdparty/ffmpeg, 删除此子模块在git中的记录,

此操作会删除以下两个内容:

  • .gitmodule文件中关于这个子模块的配置
[submodule "trunk/3rdparty/ffmpeg"]path = trunk/3rdparty/ffmpegurl = ssh://git@192.168.100.181:2222/guideir/ffmpeg.gitbranch = build_V4.2.1_ar9341
  • 本地代码目录trunk/3rdparty/ffmpeg目录

执行完以上三个步骤,则子模块被完全清除干净,接下来再添加子模块

4.添加子模块

git submodule add -b build_V4.2.1_ar9341 ssh://git@192.168.100.181:2222/guideir/ffmpeg.git trunk/3rdparty/ffmpeg

注意事项:

  • 如果没有执行删除操作中的第2步,则添加子模块时会报错:在这里插入图片描述
  • 如果没有执行删除操作中的第3步,则添加子模块时会报错在这里插入图片描述
    git pro

http://www.ppmy.cn/news/1522916.html

相关文章

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…

点云处理实操(四) -PCL中的点云三角化

目录 一、什么是点云三角化 二、常见的三角化算法 1. 贪婪投影三角化(Greedy Projection Triangulation) 2. 泊松表面重建(Poisson Surface Reconstruction) 3. Delaunay三角化(Delaunay Triangulation) 4. 球面法三角化(Ball Pivoting Algorithm, BPA) 5. Alpha…

vue ts as断言处理

在Vue中&#xff0c;使用TypeScript时&#xff0c;你可能会遇到需要初始化数组并为其指定类型的情况。在这种情况下&#xff0c;你可以使用TypeScript的as关键字来断言数组的类型。 例如&#xff0c;如果你有一个Item类型&#xff0c;你可以这样初始化一个空数组并将其类型断言…

Matlab simulink建模与仿真 第十一章(端口及子系统库)【上】

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、端口及子系统库中的模块概览 注&#xff1a;In模块、Out模块和Subsystem模块在第二章中均有介绍&#xff0c;本章不再赘述&#xff1b;Subsystem Examples子系统实例模块也不进行介绍。 二、使能及其子模…

原型模式prototype

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/prototype 能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好&#xff01;我利用Python技术自主研发了一款高效的爬虫软件&#xff0c;批量收集小红薯平台上的评论&#xff0c;包括主评论及其下的二级评论。 为了拓宽用户群体&#xff0c;让不具备编程基础的小白用户也能轻松上手&#xff0c;我开发成了界面…

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码&#xff08;压缩&#xff09;视频数据&#xff1f;✨如何编码&#xff08;压缩&#xff09;数据&#x1f384;简单的例子&#x1f384;音视频编码方式&#x1f384;视频编码格式H264编码是什么&#xff1f;发展历程&#xff1f;H.264基…

UnLua环境搭建

一、环境搭建 1、下载UnLua工程&#xff1a;https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件&#xff0c;引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

数组与贪心算法——605、121、122、561、455、575(5简1中)

605. 种花问题&#xff08;简单&#xff09; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xf…

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…

Java Kafka生产者实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Android 9.0 SystemUI状态栏/快捷设置介绍

Android 9.0 SystemUI状态栏/快捷设置介绍 状态栏 状态栏是SystemUI里的重要功能之一&#xff0c;状态栏的一大功能就是显示功能图标&#xff0c;以告知用户一些最基本的信息状态&#xff0c;在 Android 9.0 版本中&#xff0c;状态栏一般包含运营商信息、时间、日期、电池、通…

python简单计算入门教程|加减法

python通过调用numpy模块&#xff0c;非常擅长数学计算。再通过调用matplotlib模块&#xff0c;可以自由自在地输出numpy计算的结果。 今天&#xff0c;我们就尝试一些基本计算。 下述是正弦函数和余弦函数的加法和减法计算结果。 图1 代码为&#xff1a; import matplotli…

UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示

一、效果&#xff1a; 在很多游戏中为了玩家能看到墙面背后是否有敌人&#xff0c;会给被遮挡的敌人增加描边显示&#xff0c;效果如下&#xff1a; 参考&#xff1a; https://zhuanlan.zhihu.com/p/81310476 https://zhuanlan.zhihu.com/p/358140547 二、所需知识 知识点…

3.C_数据结构_栈

概述 什么是栈&#xff1a; 栈又称堆栈&#xff0c;是限定在一段进行插入和删除操作的线性表。具有后进先出(LIFO)的特点。 相关名词&#xff1a; 栈顶&#xff1a;允许操作的一端栈底&#xff1a;不允许操作的一端空栈&#xff1a;没有元素的栈 栈的作用&#xff1a; 可…

如何在 Linux 系统中禁用用户登录 ?

管理 Linux 系统上的帐户是系统管理员的一项重要任务。一个常见的任务是禁用帐户&#xff0c;由于各种原因可能需要禁用帐户&#xff0c;例如当员工离开公司或出于安全目的需要临时禁用访问时。 本指南将以简单易懂的步骤引导您完成在 Linux 系统上禁用帐户的过程。 Step 1: …

2024.9.8

打了一上午又一下午的比赛 DABOI Round 1 【MX-X3】梦熊周赛 未来组 3 & RiOI Round 4 第一场还好&#xff0c;共得180pts 难度比较合理&#xff0c;偏向正常noip 然后就发现自己计数问题很难做到推广思路&#xff0c;只会部分分 梦熊的模拟赛就抽象了 题目难度夸大…

IDEA安装教程配置java环境(超详细)

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛用于 Java 开发&#xff0c;但也支持多种编程语言&#xff0c;如 Kotlin、Groovy 和 Scala。本文将为你提供一步一步的指南&#xff0c;帮助你在 Windows 系统上顺利安装 Intelli…