Git submodule - Git子模块简介

2023-05-16

目录

  1. 建立仓库
    1.1 创建主仓库
    1.2 创建子仓库
  2. 提交内容
    2.1 提交到主工程的仓库
    2.2 提交到子模块的仓库
  3. 克隆带子模块的仓库到本地
  4. 更新子仓库
  5. 总结
  6. 参考文档

正文

软件开发中有一个DRY(Don’t Repeat yourself)原则,或者说DIE(Duplication Is Evil)原则,指的是尽可能减少一切重复工作,重用一切可能重用的东西,小到提取重复性代码,大到重用一个模块。时间就是金钱,效率就是生命。
使用Git管理项目的时候,如果涉及到模块重用,比如你需要用到别的仓库提供的功能,虽然你可以直接把别人仓库(当然也可以是自己的仓库)的代码复制到你的工程目录下,但是这样当别的仓库更新了,我们也想相应的更新我们所依赖的代码,或者我们对依赖的代码做了些更改想要合并到原仓库,这时候事情就比较麻烦了。所以,我们希望主模块和子模块的的管理是分开的,也就是主模块的更改、提交等,是不涉及子模块的,反过来子模块也一样。但是又希望他们之间有一个依赖关系,怎么办呢?
Git为了这种困境提供了一个解决方案:子模块(submodule)。
为了便于理解,我们把当前工作工程仓库成为主仓库,主仓库所依赖的子模块仓库成为子仓库。

建立仓库

创建主仓库

mkdir demo && cd demo && git init

创建子仓库

创建子仓库用到的命令是git submodule add <repo> [<path>]。其中repo是你要添加为子模块的仓库URL,path是主工程下的一个路径,就相当与你在主工程下创建的一个专门用于保存子仓库代码的文件夹,名字是任意的,只不过习惯上用third_party利于区分和理解。例如我们将pybind11添加为子模块,其相对路径为third_party/pybind11,我们可以使用以下命令:

git submodule add https://github.com/pybind/pybind11 third_party/pybind11

值得注意的是,pybind11这个目录在在使用命令前是不能存在与third_party目录之下的。并且,此命令执行完成以后,子仓库的代码就被拉取到third_party/pybind11之中了。

提交内容

主仓库和子仓库之间,除了子仓库位于主仓库内,主仓库对子仓库的代码有所依赖以外,他们之间是没有其他任何联系的。他们呢就相当于两个仓库,主仓库不会跟踪子仓库内容的变化,反过来子仓库也不去跟踪子仓库的任何信息。就类似古代周边某些附属小国,虽然名面上朝贡、附属,但实际上小国的治理和天朝是分开的。

提交到主工程的仓库

对主工程内容的提交操作,与一般无子工程的仓库操作并无二致。

提交到子模块的仓库

如果有需要对子模块的内容进行修改并提交到其仓库,可以进入到子模块仓库所在目录,再进行相应的操作。例如,我们使用cd third_party/pybind11进入到子模块仓库,这时候我们可以使用git add, git commit等对更改进行操作,这些操作之对子模块仓库产生影响。

克隆带子模块的仓库到本地

当我们需要克隆一个带子仓库的仓库时,我们希望子仓库的内容也是跟主仓库一起保存在本地的。当使用git clone xxxx.git将主仓库克隆到本地后,子仓库所在目录只有一个空目录,子仓库内容其实并为下载到本地。有两种方法:

  1. 在克隆主仓库时加上--recurse-submodules,使用这种方法,子仓库内容也会同时下载下来,如果子仓库还包含子仓库,也会被同时下载下来。
git clone xxxx.git --recurse-submodules
  1. 第二种方法是使用下面两条命令:
git submodule init
git submodule update

值得注意的是,不管使用以上那两种方法,子仓库的内容虽然下载下来了,但是此时子仓库的状态是处于一种HEAD detached的状态,也就是此时,你对子仓库的更改,就算你已经commit但是当你下次使用git submodule update你所作的更改也会丢失。所以,你学要checkout`到一个工作分支,例如:

git checkout master

更新子仓库

更新子仓库内容有两种方法,一种是进入到子仓库所在目录,进行常规的拉取和合并操作;

cd ./third_party/pybind11 
git fecth 
git merge

另一种是使用git submodule update --remote

git submodule update --remote 
git submodule update --remote <submodule ame>

两条命令的区别是,如果不带子仓库名,默认会更新所有子仓库,如果只想更新其中某个,需要指定需要更新的子仓库名。

总结

对于带子仓库的仓库,有两种情况:

  1. 本地新建仓库,需要建立与远程子仓库的依赖关系;
  2. 克隆已有带子仓库的仓库到本地。
    第一种情况:
git submodule add <repo> [<path>]

第二种情况:

git submodule init [<path>]
git submodule update
git checkout <branch>

至此,依赖关系建立起来了,两个仓库之间便可以独自操作。
可以使用git add, git commit, git status等各自操作。一句话,说的底盘听水的:在主仓库目录下,操作的是主仓库内容;cd third_party/sumdir进入到子仓库,操作的便是子仓库内容。

References

  1. Git-Tools-Submodules
  2. Manual: man git submodule

本文首发于个人公众号TensorBoy。如果你觉得内容还不错,欢迎分享并关注我的公众号TensorBoy,扫描下方二维码获取更多精彩原创内容!
公众号二维码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git submodule - Git子模块简介 的相关文章

  • http请求循环调用返回数据抓取不全解决

    最近碰到一个问题 xff0c 就是频繁调用http请求 xff0c 返回的数据出现缺失的情况 特此记录下解决过程 先上代码 普通的get调用方法 public String sendGet String urlStr throws Inte
  • shiro 报错

    最近 xff0c 在学shiro的碰到如下报错 xff1a 登录认证失败 xff01 xff01 xff01 org apache shiro authc AuthenticationException Authentication fai
  • Oracle修改用户密码引发的问题

    前几天通过plsql登录数据库时 xff0c 提示密码过期 xff0c 需要修改密码 xff0c 那就修改呗 改完过了会 xff0c 再登录 xff0c 发现用户被锁了 那就去解锁下吧 一 登录数据库服务器 su oracle sqlplu
  • 《计算机程序的构造和解释》学习笔记——过程抽象

    这篇博文里说到程序 61 数据 43 过程 xff0c 数据分为不同类型 xff0c 每种类型有不同的操作过程 例如 xff0c 两个指针变量相加是无意义的 xff0c 所以对指针类型来说加法操作是 不允许 的 在汇编层 xff0c 每一个
  • c语言初阶-数组

    今天我们来认识一下数组和操作符吧 目录 1 数组 1 1数组的概念 1 2数组的定义 1 3数组的下标访问 1 数组 1 1数组的概念 所谓数组 xff08 array xff09 xff0c 就是具有相同数据类型的集合 xff0c 存放的
  • OkHttp-ConnectInterceptor源码解析

    ConnectInterceptor源码解析 本文基于okhttp3 10 0 1 概述 ConnectInterceptor主要是用于建立连接 xff0c 并再连接成功后将流封装成对象传递给下一个拦截器CallServerIntercep
  • 第六章 信号量集

    第六章 信号量集 6 1 信号量集的结构 6 1 1 基本概念 信号量集 xff1a 信号量集实质上就是一个多输入 多输出的组合逻辑 xff0c 输入为其他任务发出的多个信号 xff0c 输出为这多个输入逻辑运算的结果 6 1 2 信号量集
  • 嵌入式软件工程师岗位需求

    嵌入式软件工程师岗位需求 A 嵌入式软件开发工程师岗位职责 a 负责嵌入式操作系统的移植和应用开发 xff1b b 负责移动互联网的应用开发 xff1b c 负责嵌入式系统图形界面的开发 xff1b d 负责系统及软件设计文档的编写 xff
  • Marlink通信协议简介

    http qgroundcontrol org mavlink start mavlink协议介绍 https pixhawk ethz ch mavlink 消息简介 MAVLink简介 Mavlink协议最早由 苏黎世联邦理工学院 计算
  • List、Stack、Queue、Set和Map定义和常用方法

    集合 Java容器类库中的两种主要类型 1 每个槽只保存一个元素 Collection xff1a 描述所有序列容器的共性的根接口 xff1b List xff1a 以特定的顺序保存一组元素 xff1b Set xff1a 元素不能重复 x
  • MDK移植freeRTOS及多任务创建

    MDK移植freeRTOS及多任务创建 一 移植前准备二 freeRTOS移植三 创建任务 本文所使用的硬件为野火的指南者开发板 xff0c 购买后 xff0c 商家会提供已经移植好freeRTOS的工程可以直接使用进行开发 但如果没有现成
  • ubuntu如何进入修复模式,单用户模式,在进入系统前调出root用户的终端进行修复

    在进入Ubuntu界面前选择 Advanced options for Ubuntu 这一项进入 进入后在当前界面选择 recovery mode 这一项进入 进入后在当前界面选择 root 这一项进入 此时会在底部出现这样的画面 xff0
  • Semaphore的注意点

    seamphore大家玩的都比较多 xff0c 使用起来也很简单 xff0c 获取令牌和释放 xff0c 但是其中坑却不少 xff0c 而且会让人很难发现 xff0c 希望能通俗易懂的小例子讲明白其中的几个道理 一 线程都被阻塞了 xff1
  • tinymix的命令格式

    come from https blog csdn net jinchengzhou article details 82796888 最近在调试安卓系统的alsa驱动 xff0c 一开始搞不清楚tinymix要怎么用 xff0c 今天终于
  • Ubuntu Core 20新系统介绍

    Ubuntu Core 20是一个轻量 xff0c 容器化 xff0c 基于Ubuntu 20 04 LTS且为物联网设备和嵌入式系统所打造的版本 xff0c 现在已经普遍可用 新版本内建的安全更新严格限制策略使创新者能够开发高安全的产品和
  • python库Argparse中的可选参数设置 action=‘store_true‘ 的用法

    store true 是指带触发action时为真 xff0c 不触发则为假 通俗讲是指运行程序是否带参数 看例子就明白了 一 没有default import argparse parser 61 argparse ArgumentPar
  • 小熊派鸿蒙开发板环境搭建过程(HarmonyOS BearPi-HM Nano)

    小熊派鸿蒙开发板环境搭建过程 实验环境 xff1a 小熊派开发板 xff0c 基于Hi3861V100海思芯片Win10系统Oracle VM VirtualBox虚拟机Ubuntu系统安装包官方提供环境教程 xff08 基本按照这个步骤来
  • ubuntu安装新版本的clang-format 9

    ubuntu安装新版本的clang format 默认可能是clang format 6 0 旧版本的某些配置比如AlignConsecutiveMacros不支持 sudo apt get update sudo apt get inst
  • Android 视频 YUV i420格式转换为位图Bitmap

    Android 视频 YUV i420格式转换为位图Bitmap YUV基础描述 YUV YCbCr xff0c 图像除了RGB xff0c 还有YUV 定义 xff1a 是电视系统所采用的一种颜色编码方法 Y 标识明亮度 xff0c 也就
  • 谷粒学院——第二章、项目搭建

    一 创建父工程 1 创建sprigboot工程guli parent 在idea开发工具中 xff0c 使用 Spring Initializr 快速初始化一个 Spring Boot 模块 xff0c 版本使用 xff1a 2 2 1 R

随机推荐

  • 欧美网站风格特点

    评论一 xff1a 1 简洁 xff0c 平淡 xff0c 严谨 xff08 不习惯艳丽 xff0c 花销的色彩 xff09 2 倾向于将首页做成各类功能 板块的引导界面 xff0c 首页不会放置太多的内容 xff0c 即使有内容表现 xf
  • 2012年展望

    由于各种原因 xff0c 客观的 主观的 不过归根结底还是主观的多一些 xff0c 2011年整体过的很颓废 xff0c 上班大多在上网 xff0c 工作上几乎没有一点成绩 xff0c 自己也是很不满意 2012年世界末日都快来了 xff0
  • Ubuntu允许root远程登陆方法

    Ubuntu中允许root用户远程登录 编辑配置文件 xff1a sudo vim etc ssh sshd config 将PermitRootLogin prohibit password更改为 xff1a PermitRootLogi
  • 航模的遥控与电调

    遥控接收机解码出遥控器的信号 xff0c 有多少路的解多少路 xff0c 解出来的其实就是pwm的脉冲信号 xff0c T 61 20ms 脉宽是1 2ms xff0c 脉宽1ms时表示最小值 xff0c 脉宽2m时表示最大值 xff08
  • Flash某些错误解决

    运行是提示VerifyError 1014 无法找到类 修改文件后 xff0c 加载的总是旧文件 xff1f 清理IE缓存试试
  • Shell编程入门学习

    文章目录 Shell编程Shell脚本的执行方式Shell的变量Shell的变量的介绍shell变量的定义 设置环境变量位置参数变量介绍基本语法 预定义变量基本介绍基本语法 运算符基本语法 条件判断判断语句常用判断条件 流程控制if 判断c
  • module.exports与exports,export与export default之间的关系和区别

    module exports与exports xff0c export与export default之间的区别及使用 这里我就以最简单的方法 xff0c 举例说明 CommonJS xff1a 使用module exports与export
  • Recipe terminated with error. Retry building the project.

    Recipe terminated with error Retry building the project 在vscode中运行latex中出现此错误时 xff0c 但之前又输入正常 首先检查文件是否保存在有中文路径中 试着将文件更换一
  • 在命令窗口如何退出命令窗口的文本输入回到命令行

    退出文本编辑或运行的程序 第一种情况 进入命令窗口下的文本输入 xff0c 或正在执行的代码 情况如图1所示 xff1a 图1 在这种情况下则按Ctrl 43 C则可退出 xff01 xff01 第二种情况 使用vi命令进入文本编辑器时退出
  • Latex/Markdown中将字母上下方插入字母数字

    Latex Markdown中将字母上下方插入字母数字 演示在typora软件里面插入Latex公式 通常在字母前面加入 mathop将 中的字母数字当作数学符号使用 xff1b 都加 mathop xff1a 1 xff1a 不加 lim
  • Python实例5:身体质量指数BMI问题分析

    Python实例5 xff1a 身体质量指数BMI问题分析 问题需求 xff1a 1 xff09 输入 xff1a 给定体重和身高值 xff1b 2 xff09 输出 xff1a BMI指标分类信息 xff08 国际和国内 xff09 xf
  • Python实例7:七段数码管绘制

    Python实例7 xff1a 七段数码管绘制 基本思路 xff1a 绘制单个数字对应的数码管 xff1b 获得一串数字 xff0c 绘制对应的数码管 xff1b 获取当前系统时间 xff0c 绘制对应的数码管 xff1b 步骤 xff1a
  • Python实例13:体育竞技分析

    Python实例13 xff1a 体育竞技分析 8 1 1 问题分析 需求 xff1a 毫厘是多少 xff1f 如何科学分析体育竞技比赛 xff1f 输入 xff1a 球员的水平 xff1b 输出 xff1a 可预测的比赛成绩 xff1b
  • 解决anaconda虚拟环境连接不上jupyter的kernel的方法(无法连接服务)

    jupyter日志 xff1a ImportError cannot import name AsyncGenerator 问题 xff1a 在anaconda中创建conda虚拟环境后安装ipykernel xff0c 在jupyter中
  • Tensorflow代码学习-8-3下载google图像识别网络inception-v3并查看结构

    下载google图像识别网络inception v3并查看结构 课程 xff1a 炼数成金GITHUBCSDN知乎欢迎点亮star span class token keyword import span tensorflow span c
  • Tensorflow代码学习-10-3验证码识别

    验证码识别 课程 xff1a 炼数成金GITHUBCSDN知乎欢迎点亮star span class token comment coding utf 8 span span class token keyword import span
  • 腾讯云ubuntu远程桌面

    1 首先要连接上你的服务器 xff0c 然后安装vncserver xff0c 这个是用来远程连接用的 命令如下 apt get install vnc4server 2 安装图形界面 apt get install xfce4如果安装不上
  • 如何快速上手期刊、会议论文latex的小技巧

    来自学习经验 xff0c 如有更好可评论告知 xff01 适用于各种期刊 会议的小技巧 xff01 xff01 可节省非常多时间 xff01 xff01 知乎专栏 简单描述如下 xff1a 1 找一篇与要投的期刊一篇论文 2 去arxiv网
  • 解决 树莓派自带的VNC版本不能进行文件传输

    在树莓派4B上使用的VNCSERVER是可以进行文件传输的 xff0c 就想应该是树莓派3B 43 上的操作系统自带的VNC版本太旧 xff0c 因此就想直接用命令sudo apt upgrade tightvncserver更新 xff0
  • Git submodule - Git子模块简介

    目录 建立仓库 1 1 创建主仓库 1 2 创建子仓库提交内容 2 1 提交到主工程的仓库 2 2 提交到子模块的仓库克隆带子模块的仓库到本地更新子仓库总结参考文档 正文 软件开发中有一个DRY Don t Repeat yourself