Git -- 子模块

2023-05-16

子模块

如果想直接上手操作,可以只看 “适用场景”、“定义”、“快速使用” 小节

否则看这篇文章或者 原文 都可以

文章目录

    • 子模块
      • 适用场景
      • 定义
      • 快速使用
        • 添加子模块
        • 同步本地到远程
        • 克隆带有子模块的仓库
        • 分支操作
        • 同步远程到本地
      • 相关命令
      • 信息补充
      • 遇到问题
        • 操作失败
        • 忽略文件无效
      • 未涉及部分
          • 子模块引用修改
          • 嵌套子模块

适用场景

多个项目依赖一个库,每个项目可以修改库,并且保持库的同步。

定义

广泛的子模块:以A 为一个整体,B 为一个整体。将B 作为 A 中的一部分,即称B 为A 的子模块。

文件结构如下:

A
|-- README.md
|-- B
    |-- README.md

父仓库:git 的整体即仓库,故而本文称A 为父仓库。

子模块:同理,B 为子仓库,因为概念为submodule,故而本文称B 为子模块

因为仓库本身是工具型。所以子模块的添加不应该增加或应该较少增加工具使用的负担。因此git 子模块有专门的命令将子模块和父仓库关联,以达到直接在父仓库执行命令操作子模块的便捷性。

但是由于一定的原因,在克隆、同步父仓库的时候,父仓库默认不会操作子模块,即需要使用者额外增加参数或者步骤

同步:因为子模块有个update 的操作,所以仓库的fetch,pull,push操作在这里统一叫做同步

更新:专指 update

本文中【】括起来的文本表示命令,可以在“相关命令” 小节里查看对应的命令语法

如【添加子模块】,直接全文搜索 输入“添加子模块”, 就可以在 “相关命令” 小节看到,且会比使用的地方有更详细的说明

快速使用

父仓库和子模块,各自单独进行自身维护的时候,和常规流程没什么区别。这里不多做说明

主要在于父仓库添加了直接操作子模块的步骤,使得使用更加复杂。

但是关于操作复杂化这一点,熟悉命令之后,可以参考【配置】和【常用别名】进行一波命令优化。

环境 git 2.20.1 (Apple Git-117)

添加子模块

假设当前有两个独立仓库baba,didi,didiUrl 表示didi 的远程地址

希望baba 作为父仓库,didi 作为baba 的子模块

(可能需要 “常见问题” – “忽略文件无效” 小节)

  • 如果baba 仓库中没有didi 文件夹

    git submodule add didiUrl #在父仓库【添加子模块】
    git commit -sa #提交更新
    
  • 如果baba 仓库中有同名didi 文件夹

    • 就是想将didi 转化成子模块

      #把文件拷贝,并更新到didi仓库
      
    •   git rm -r subDirectory #在父仓库先删除原先的didi index
        rm -r #然后常规删除didi 文件
        
        git submodule add didi #在父仓库【添加子模块】
        git commit -sa #提交更新
      
    • didi 只是冲突

      • 修改父仓库didi 文件

        mv ./didi ./didiInBaba #给父仓库的didi 换个文件名
        git rm -r subDirectory #删除原先的didi在父仓库的记录
        
        git submodule add didi #在父仓库【添加子模块】
        git commit -sa #提交更新
        
      • 修改didi 在父仓库的名字

        git submodule add didi didiIn #在父仓库【添加子模块】
        git commit -sa #提交更新
        

同步本地到远程

现在本地仓库有了子模块,如果要同步,可以有两种方式

  • 父仓库同步

    git push --recurse-submodules=check #【push递归子模块】,检查子模块同步,防止依赖使用失败
    
  • 只是子模块同步

    cd didi #进入子模块目录
    git push origin #同步
    cd ..
    

克隆带有子模块的仓库

git clone babaUrl #克隆
cd didi #进入didi 文件目录,此时没有任何文件
git submodule init #初始化子仓库本地配置文件,没有懂这里的配置文件是啥
git submodule update #同步子模块的数据

cd didiSubmodule #如果didi 也还有子模块
...

上述步骤实在有些繁琐

git clone --recurse-submodules babaUrl #【克隆递归子模块】一步完成,并且自动递归
git checkout master #将didi 的HEAD 去除游离状态

分支操作

现在已经有了 带有didi 子模块的babaWithDidi 仓库

  • checkout

    • 独步操作

      • 从有didi 的分支master 切换到没有didi 的分支dev

        (master)$ git checkout -f dev #强制覆盖, 可以先看下不加-f 会怎么样
        (master)$ rm -r didi #删除无关的文件
        
      • 从没有didi 的分支master 切换到有didi 的分支dev

        (dev)$ git checkout master
        (master)$ cd didi
        (master)$ git submodule update #更新子模块
        (master)$ git checkout master #去除游离态
        
    • 递归操作

      git checkout --recurse-submodules #【checkout递归子模块】
      

同步远程到本地

现在已经有了 带有didi 子模块的本地 babaWithDidiLocal,克隆自远程的babaWithDidi 仓库

  • 本地仓库没有修改

    • babaWithDidi 仓库整体修改

      git pull --recurse-submodules #【pull递归子模块】
      

      或者

      git pull #拉取
      git submodule update --init --recursive #【更新子模块】
      cd didi
      git checkout master #去除游离态
      
    • didi 修改,而babaWithDidi 没有修改 (其实也属于“babaWithDidi 仓库整体修改”的一种情况)

      cd didi #进入子模块目录
      git pull #同步
      
      cd ..
      git commit -sa #提交修改
      

      或者

      git submodule update --remote --merge #更新子模块
      git commit -sa #提交修改
      
  • 本地仓库有修改

    • babaWithDidi 更新了babaWithDidi/didi, babaWithDidiLocal 也更新了 babaWithDidiLocal/didi

      #此时父仓库和子模块,对于远程而言,进度都已经分叉
      (babaWithDidiLocal)$ git pull #可以正常合并,或者使用【pull递归子模块】也可以
      

相关命令

关于命令的格式,参看 命令行格式说明

没有模块名字作为参数的都是处理所有子模块

#配置

#子模块url 修改
git config submodule.<submoduleName>.url <URL> #修改子模块在本地配置的 url
git config --global diff.submodule log #配置后,git diff 等同于 git diff --submodule
git config status.submodulesummary 1 #配置后,git status 展示子模块的摘要
git config submodule.recurse [1|true] #配置后,除了clone,命令默认添加--recurse-submodules(支持的话) 
git config -f .gitmodules submodule.<submoduleName>.branch <branchName> #配置【更新子模块】默认拉取的分支,-f 表示影响所有人,没有则只影响自己。可以省掉去除游离态的步骤
git config push.recurseSubmodules [check|on-demand] #配置【push递归子模块】时的检查行为

#常用别名
git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'"
git config alias.spush 'push --recurse-submodules=on-demand'
git config alias.supdate 'submodule update --remote --merge'

#命令

#添加子模块
git submodule add <submoduleURL> [targetName]//subURL 可以是相对路径也可以是url
#更新子模块,本地配置
git submodule update [--init] [--recursive] //如果没有初始化过,需要init;如果有嵌套,需要recursive
#更新子模块,从远端
git submodule update --remote [--merge|rebase] //默认master,没有[--merge|rebase]是游离态,要在父仓库使用

#命令参数

git log -p --submodule //展示子模块的修改记录
git diff --cached --submodule 
git diff --cached [submoduleName]
#checkout递归子模块
git checkout --recurse-submodules
#pull递归子模块
git pull --recurse-submodules
#push递归子模块
git push --recurse-submodules=[check|on-demand] //check 表示如果子模块有没push的,直接失败;on-demand则先尝试push子模块再失败
#克隆递归子模块
git clone --recurse-submodules <srcURL> [targetURL]

#遍历工具

git submodule foreach <`gitCommand`> #对每个子模块执行command
#常用 foreach
git submodule foreach 'git stash'
git submodule foreach 'git checkout -b featureA'
git diff; git submodule foreach 'git diff'

信息补充

父仓库和子模块关联之后

  • 子模块也会以一种特殊文件模式(160000,表示该文件在提交中,是作为一个目录整体)存储在父仓库的 .git 中。

  • 会在父仓库修改或创建 .gitmodules ,这个文件记录了子模块和父仓库的映射关系,当前示例为:

    [submodule "didi"]
    	path = didi
    	url = ../didi
    

    当其他人克隆父仓库的时候,将依据此文件中每个子模块的url 拉取数据

    可以用【子模块url 修改】

  • 子模块是否创建的依据,可以通过在子模块目录查看git log,成功则显示子模块 的日志

  • git status默认看不到子模块的信息,需要参考【配置】

  • 提示信息中会出现 update 、左箭头< 等相关的字样

遇到问题

操作失败

Q:在分支A 进行了某个操作,同步到分支B 的时候,没有生效

A:

master 分支有didi 子目录,而dev 有didi 子模块 (且是从原先的didi 子目录转化过来)

同时didi 子目录中有一文件temp 是 gitignore 掉的

以如上场景执行merge 操作为例:

#个人理解,merge 简单来看,是将dev 中和master 的不同,在master 上补全
#只是因为temp 文件被忽略,dev 操作temp 的步骤,不会被git 追踪,即master 上无法获悉
#然后master 补全的时候,无法对 didi/temp 进行操作
#此时git 发现,master 上的didi 不为空,所以不会去做后续的操作
#最终导致didi 转化成子模块失败

#处理办法
(master)$ rm -r temp #只能先自己将temp 相关的操作再次执行一遍
(master)$ master merge didi #然后就可以了

#相信还有很多类似的情况,思路应该都是一样

忽略文件无效

A:在子模块中的文件,并不会被父仓库的.gitignore 文件作用。

Q:需要自己再补充一个,否则可能造成"操作失败"的问题

未涉及部分

子模块引用修改

额,用了git 几年了,基本没有引用修改的情况(都是宁可用新地址重新下一个哈哈哈)

暂时不测试了。(有需要看原文“合并子模块修改 Merging Submodule Changes“小节哦)

嵌套子模块

因为暂时还不在需求范围之内,不做具体使用测试。估计没啥毛病

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

Git -- 子模块 的相关文章

  • ov_eval说明

    目录 ov evalpose to fileformat convertererror comparisonerror dataseterror singlerunerror simulationtiming singleruntiming
  • arm开发板de1-soc配置opencv3.2环境

    0 温馨提示 不要尝试vnc虚拟桌面 xff0c 不要尝试高版本ubuntu镜像 xff0c 更不要尝试交叉编译 当然做以上这些尝试你确实可以学到更多东西 xff0c 不止学会怎么用这个板子 1 准备所需材料 1 1 opencv3 2 h
  • 2020-11-10

    https pan baidu com s 1uvuB6ahrfijMiWy9AqFCig
  • 杰理之AT协议之协议说明【篇】

    xff08 1 xff09 MCU发给芯片的数据包称为CMD xff08 命令 xff09 xff0c MCU通过发送CMD来完成配置蓝牙 xff0c 控制蓝牙连接 xff0c 发送数据等操作 xff08 2 xff09 芯片发给MCU的数
  • 杰理之创建静态任务和创建动态任务有什么区别,该如何选择?【篇】

    答 xff1a 静态任务创建时采用的是静态内存 xff0c 而动态任务创建时采用的动态内存 采用静态任务创建可以减小内存碎片 xff1b 动态任务创建由于会频繁分配和释放内存 xff0c 容易产生内存碎片 因此系统运行期间都必须存在的任务可
  • 杰理之AT协议说明【篇】

    xff08 1 xff09 MCU 发给芯片的数据包称为 CMD xff08 命令 xff09 xff0c MCU 通过发送 CMD 来完成配置蓝牙 xff0c 控制蓝牙 连接 xff0c 发送数据等操作 xff08 2 xff09 芯片发
  • 最新详细版Ubuntu20.04安装教程

    文章目录 浏览设置默认迅雷下载下载UbuntuVMware中添加虚拟机 浏览设置默认迅雷下载 很多资源使用迅雷下载会比使用浏览器下载快很多 这里给大家说如何设置浏览器默认使用迅雷下载 打开迅雷 xff0c 打开迅雷的设置中心 xff0c 找
  • ubuntu 14.04 opencv2 和opencv3 多个版本切换使用

    最近在学视觉SLAM过程中要使用opencv2 和opencv3 xff0c 虽然说在程序里能修改opencv 代码 xff0c 但是自从用上linux后不怕折腾的精神已经深入人心 安装双opencv切换使用多方便 在折腾了若干次之后终于成
  • Jetson TX2刷rtso-9003并使用Jetpack安装软件包

    Jetson TX2刷rtso 9003并使用Jetpack安装软件包 为Jetson TX2刷rtso 9003系统并使用Jetpack安装其他软件包 xff08 CUDA TensorRT cuDNN等 xff09 1 在主机上下载并安
  • FLIR Thermal Starter 数据集详解

    简介 下载地址 xff1a https pan baidu com s 11GJe4MdM NH6fuENCQ2MtQ 提取码 019b官方网站 xff1a https www flir com oem adas adas dataset
  • 关于qt.qpa.plugin: Could not load the Qt platform plugin “xcb“的问题

    今天在运行代码的时候出现了以下错误 xff0c 经查找资料 xff0c 找到了解决方法 错误如下 xff1a QFactoryLoader span class token punctuation span span class token
  • 【工具推荐】Windows下读取Linux系统的文件,Linux Reader4.5 By DiskInternals

    前言 相信做机器视觉相关的很多人都会安装 Windows 和 Linux 双系统 在 Linux 下 xff0c 我们可以很方便的访问Windows的磁盘 xff0c 反过来却不行 但是这又是必须的 通过亲身体验 xff0c 向大家推荐这么
  • Windows/Linux下创建文件夹的软连接,让一个大数据在电脑上只存在一份

    前言 相信我们在使用计算机的过程中存在这样的情况 xff0c 不同的地方都需要用到同一个大的视频或者其他数据 常常需要把这些数据复制过来复制过去 xff0c 浪费时间和空间 这时候 xff0c 创建数据或者文件夹的软连接就显得很方便了 让连
  • 2D目标检测模型表现总览

    前言 2D检测领域各种模型层出不穷 xff0c 为了对他们有一个直观的印象 xff0c 想要总结这么一张表 强烈欢迎大家补充 修正 更改以及完善 xff01 可以在本文留言 xff0c 或者去github上修改 xff0c 谢谢 xff01
  • pyrealsense2 初步使用教程

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 如何表示MASK

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 使用合成数据改善机器学习中的极度不平衡数据集

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • NVIDIA A100 深度解密(一):GPU 峰值计算那些事

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 算法中七种常见的时间复杂度

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • Python之日志处理(logging模块)

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师

随机推荐

  • 李群、李代数之我的理解

    我目前的研究领域转到了立体匹配方向 但是基础很薄弱 xff0c 很多理论知识都需要补充 希望自己能够满满的累积起足够的基础知识 这篇博客主要是记录自己对李群 李代数的初步理解 xff0c 还请大家一些讨论进步 参考资料 lie group
  • 科研神器软件(关于查词、翻译)

    整理了几个和科研相关的神器软件 网址 xff0c 关于英文写作 翻译 查词的 xff0c 记录如下 xff1a 英文写作的词句库网站 xff0c 包含大量的例句和写作模板 xff1a https www phrasebank manches
  • CT典型数据——shepp_logan体模数据的生成 python版本

    phantominator包介绍 网址 xff1a https github com mckib2 phantominator安装 xff1a pip install phantominator简介 xff1a 用于简便的生成 numeri
  • 解决 dpkg 安装出错后的 Sub-process /usr/bin/dpkg returned an error code (1) 错误

    前言 在使用 dpkg i 安装 deb软件包的过程中 xff0c 会出现安装失败的可能 之后无论用 sudo apt install f or sud apt autoremove 等常见的修复命令都是无效的 网络上很多解决方案都直接给出
  • Ubuntu20.4 休眠之后网络出现问题的解决方案

    问题简介 Ubuntu20 04 在休眠之后 xff0c 如果网络出现了无法连接或者无法共享的各种问题 xff0c 只有重启才能解决 xff0c 那么以下操作可以让你不用重启电脑 解决方案 重启 network kernel modules
  • 京东京造K系列机械键盘在Linux下的使用

    前言 京东京造是一款为Mac iPad iPhone适配出色的蓝牙键盘 xff0c 官方也支持Win系统 这款键盘 xff0c 其实就是Keychron K8 xff0c 国外非常火的Mac键盘 xff0c 深受苹果用户的喜爱 YouTub
  • 事件相机仿真器(ESIM)安装记录

    前言 在 Ubuntu 20 04 下安装 ESIM 事件相机仿真器 特此记录 资料 官网 https github com yunxdai rpg esim 安装指导 https github com uzh rpg rpg esim w
  • [翻译]解决使用 git clone 命令时出现的 ‘gnutls_handshake() failed’ 错误

    错误介绍 使用 git clone 时出现如下错误 xff1a fatal unable to access 39 https github com Syllo nvtop git 39 gnutls handshake failed Th
  • 解决 pycharm 从快捷方式启动与从终端启动环境不同的问题

    前言 博主在安装了 ros 相关的两个python包 rospy 和 roslaunch 之后 xff0c pycharm 无法 import 这两个包 但是在终端中用同样的python解释器又可以import这两个包 同时 xff0c 从
  • Ubuntu 常用命令使用记录

    Linux 查找包含特定关键词的文件 grep r E 39 word1 word2 word3 39 yourpath gt gather log 如果要and关系查找 则要用管道 grep pattern1 files grep pat
  • Linux 通过 SSH 挂载远程文件夹

    前言 在两台Linux电脑之间 xff0c 我们可以通过ssh方便的登录另一台电脑并访问它的文件或者文件夹 但这都是我们用户在进行操作 想要在一台电脑上运行程序 xff0c 处理放在另一台电脑上的文件时 xff0c 我们应该如何设置呢 xf
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 28 ROS node init 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波 xff1f 很多ROS新手编写节点的时
  • Ubuntu 终端前多了个 base

    Ubuntu 终端前多了个 base xff0c 想将base去掉 xff0c 如何操作 xff1f 原文 xff1a https blog csdn net qq 35544714 article details 109270602 装完
  • GNU __attribute__浅析

    GNU attribute 浅析 1 介绍 attribute 是GCC的特性 xff0c 其实是个编译器指令 xff0c 告诉编译器声明的特性 xff0c 或者让编译器进行更多的错误检查和高级优化 attribute 可以设置函数属性 x
  • FreeRTOS学习(一)

    1 FreeRTOS任务基础 1 1 多任务系统 在51单片机 AVR STM32裸机编程时 xff0c 我们通常都是用一个main函数里面加一个while 1 做一个大循环来完成所有的事务处理 xff0c 同时在加上中断处理一些较为紧急的
  • FreeRTOS学习(四)

    4 FreeRTOS信号量 4 1 信号量简介 信号量主要是用于对共享资源的访问和任务同步 具体的使用例子就不进行展开 4 2 二值信号量 4 2 1 二值信号量简介 二值信号量通常用于互斥访问或同步 xff0c 二值信号量与互斥信号量非常
  • FreeRTOS学习(七)

    7 系统裁剪 7 1 简介 FreeRTOS中的系统裁剪和配置其实是通过条件编译的方法来实现的 xff0c 不止FreeRTOS这么干 xff0c 很多的协议栈 RTOS系统和GUI库都是使用条件编译的方法来完成配置和裁剪的 在第二章使用静
  • 【APM】第一个应用程序

    第一个应用程序 此部分对应教程原文 http ardupilot org dev docs learning ardupilot the example sketches html HelloWorld 代码编写及编译 学习任何一种平台都从
  • 无人机定高算法

    高度控制 高于目标值时应该减速 xff0c 要输出负值 xff0c 所以高度差 61 目标高度 当前高度 速度控制 xff1a 向上时 速度为正 应该减速 xff0c 要输出负值 xff0c 所以速度差 61 高度差的速度 当前速度 如果只
  • Git -- 子模块

    子模块 如果想直接上手操作 xff0c 可以只看 适用场景 定义 快速使用 小节 否则看这篇文章或者 原文 都可以 文章目录 子模块适用场景定义快速使用添加子模块同步本地到远程克隆带有子模块的仓库分支操作同步远程到本地 相关命令信息补充遇到