文章目录

  • 综述
  • 要点
  • 细节
    • 如何新增一个submodule?
      • 如何手动.gitmodules修改首次增加一个submodule?`git submodule init`,init子命令依据.gitmodules
      • .gitmodules如何命令修改某个成员以及同步?
      • 如果submodule需要修改分支怎么办?`git submodule update`,update子命令依据.git/config
      • 仅仅修改.gitmodules不执行sync的效果
      • 如何新增一个submodule比较方便的方法:`git submodule add`
        • 实验一个完全新增本地仓库作为子模块
      • 组合命令`git submodule update --init`
    • 如何查看所有submodule的信息
      • 查看哪些submodule
      • 查看每个submodule的分支信息`git submodule foreach 'git status | head -n 1'`
  • 其他
    • 其他一些命令
      • 查看每个submodule的和远端不同修改`git diff HEAD --submodule=log`
      • 查看某个submodule对应的gitlink的commitid
      • 如何拉取子模块远端最新代码
  • 要点再回顾
  • 综述

综述

submodule的一些问题记录

要点

# 首次增加
git submodule add xxx localdir = vim .gitmodule + init + sync + update

细节

如何新增一个submodule?

如何手动.gitmodules修改首次增加一个submodule?git submodule init,init子命令依据.gitmodules

一句话原理是:新增/修改项目根目录下.gitmodules,然后执行git submodule init

git submodule init 告知git要关联哪些子模块。它会从 .gitmodules文件中拷贝子模块设置,复制到主项目的配置 .git/config文件。修改后 .git/config会有submodule对应的配置项,内容和.gitmodules相同。
如果只指定一个submodule就是用:git submodule init plugins/demo

.gitmodules格式:一般只用指定path、url、branch

# 每个子模块一个 [submodule "<name>"] 段
[submodule "deps/spdlog"]path = deps/spdlog                 # 检出到哪个目录(相对仓库根)url = https://github.com/gabime/spdlog.git  # 远端仓库地址branch = v1.x                      # 可选;--remote 时默认跟踪的分支# 下面都是可选扩展字段fetchRecurseSubmodules = false     # 递归拉子模块?true/falseupdate = checkout                  # 默认更新策略:checkout/merge/rebaseignore = dirty                     # git status 是否忽略子模块改动[submodule "external/json"]path = external/jsonurl = git@github.com:nlohmann/json.gitbranch = develop
字段可选值含义 / 效果说明
path任意相对路径字符串(必填)子模块在父仓库中的检出目录;示例:path = deps/libfoo
url任何 Git 支持的地址(必填)远端仓库地址;示例:url = https://...url = git@... 或相对路径 ../bar.git
branch任意远端分支名(可选)git submodule update --remote 时默认拉取的分支;未写则默认 master/main
updatecheckout(默认)直接跳到父仓库记录的 commit;最常用
merge把本地改动做 merge,可能产生 merge commit
rebase把本地提交 rebase 到新 commit,历史线性
none禁止自动更新,需手工进入子模块目录操作
fetchRecurseSubmodulestrue父仓库执行 git fetch/git pull 时递归拉取子模块
false(默认)只 fetch 父仓库本身
ignorenone子模块任何差异都出现在父仓库 git status(最严格)
untracked忽略子模块内未跟踪文件;已修改/已提交差异仍显示
dirty(默认)忽略子模块内所有未提交改动,仅显示 HEAD 移动
all完全忽略子模块,任何变化都不出现在父仓库 status
shallowtrue浅克隆,只拉最近一次 commit(省磁盘/时间)
false(默认)完整历史,后续可 log/blame

注意修改后记得提交.gitsubmodule到主仓库

.gitmodules如何命令修改某个成员以及同步?

前面提到了.gitmodules可以通过修改文件,还可以命令修改:git config -f .gitmodules submodules.mytest1.branch master修改
在这里插入图片描述
修改后需要sync

如果submodule需要修改分支怎么办?git submodule update,update子命令依据.git/config

一句话是:先修改.gitmodules,再sync,在git submodule update会根据.git/config中的配置拉取。核心是git submodule update根据.git/config来的。

首先更新.gitmodules
然后将.gitmodules文件的配置,显示同步到.git/config中,执行git submodule sync。会提取新的URL
注意截止目前仅仅修改了配置,并未让工作区的子模块内容修改,然后使用git submodule update更新子项目中的文件。
该命令的动作:

  1. 访问.git/config中的子模块版本库(注意:如果修改.gitmodules,不会同步到.git/config中, 前文提到了必须git submodule sync后,后面的命令才能用。也即如果修改.gitmodules之后,需要sync之后才能执行update)
  2. 拉取版本库提交对象的ID
  3. 将代码checkout到对应目录(config中指定)

为了保险起见,如果本地未修改子模块的代码,可以先删掉或者备份子模块的目录,然后再执行git submodule update

值得注意的:

  • 如果主项目有git reset回退历史记录或者git checkout了主干分支,子模块的版本信息等不会处理,需要手动处理。子模块假设回退中修改了.gitmodules,需要git submodule sync, 然后git submodule update
  • 如果用户在子模块执行了git拉取或者切换版本,会更新gitlink。
  • git submodule update会让子模块脱离分支,而转向某个commitid,该commitid就是gitlink,可以用git ls-tree HEAD path/to/yoursubmodule查看
  • git submodule的本质是修改gitlink的机制。所以在子模块执行git相关修改,变化了gitlink的值,同样会生效,但是是否需要执行submodule相关的操作,需要关注.git/config .gitmodules文件是否有更新

仅仅修改.gitmodules不执行sync的效果

在这里插入图片描述
注意:如果首次添加不能用sync,需要先init或者submodule add(参考后文)

如何新增一个submodule比较方便的方法:git submodule add

git submodule add ../repo1/repo1.git mytest1

这会自动更新 .gitmodules 和 .git/config 文件。

  • 如果遇到错误如何处理:
$ git submodule add ../repo1 mytest1
Cloning into '/Users/yourusername/workspace/gitsubmodule/repo2/mytest1'...
fatal: transport 'file' not allowed
fatal: clone of '/Users/yourusername/workspace/gitsubmodule/repo1' into submodule path '/Users/yourusername/workspace/gitsubmodule/repo2/mytest1' failed

原因:传输协议限制
fatal: transport ‘file’ not allowed 表明 Git 配置可能限制了使用本地文件系统作为仓库来源。
解决办法:
git config --global protocol.file.allow always
修改后执行:
在这里插入图片描述
推荐这种方法进行submodule add,并且自动修改.gitmodules和config。简单理解可以是:git submodule add xxx xxx = vim .gitmodules + git submodule sync
cat .gitmodules可以看到对应的新增的配置:(第一次手动修改.gitmodules因为url指定不对并未成功)
在这里插入图片描述
以及自动sync的结果:
在这里插入图片描述
所以如果新增submodule,建议直接使用命令添加。避免手动添加的错误。添加后可以修改url等,然后再sync。

实验一个完全新增本地仓库作为子模块

在这里插入图片描述
可以看到一条add就自动同步所有动作:git submodule add xxx localdir = vim .gitmodule + init + sync + update
在这里插入图片描述

组合命令git submodule update --init

一句话:修改.gitmodules文件后,如果是新增一个,git submodule update --init = 先init + 再update, 修改文件角度看是:init修改了.gitmodules, 并且 sync,然后执行update,update根据.git/config更新工作空间。
还有一个理解是:init是控制链路,影响的是git的配置相关文件,update是数据链路,将控制文件在实际工作空间生效。
还有一个不太准确的等式是,在新增一个submodule场景下:git submodule add xxx dir = 修改.gitmodules + init + update。如果是新增的仅仅执行修改.gitmodules + sync + update是不生效的。换而言之sync的内部实现,可能会先检查.git/config是否已经有submodule,如果没有sync并不会将.gitmodules新增的同步过去。所以init对.git/config而言有 类似create+modify的能力,而sync只有modify的能力,如果“表项”不存在,不能create能力。

如何查看所有submodule的信息

查看哪些submodule

git submodule summary

在这里插入图片描述

查看每个submodule的分支信息git submodule foreach 'git status | head -n 1'

git submodule foreach 'git status | head -n 1'

在这里插入图片描述

其他

其他一些命令

查看每个submodule的和远端不同修改git diff HEAD --submodule=log

git diff HEAD --submodule=log
在这里插入图片描述

查看某个submodule对应的gitlink的commitid

git diff HEAD – mytest1 #指定某个submodule
在这里插入图片描述
如果有修改会加上后缀dirty
在这里插入图片描述
在这里插入图片描述

在主仓库git diff,如果未配置,只能看到某个submodule的commitid被修改。看某个子仓库,初阶玩法建议直接cd到目录下进行查看:cd mytest1 && git diff
在这里插入图片描述

如何拉取子模块远端最新代码

git submodule update --remote
下面以一个实验演示:实验会在远端仓库修改文件,然后本地submodule无法直接看到,然后submodule --remote更新,可以同步远端,并且更新gitlink的commitid和远端一致

  • 第一步:修改远端仓库并且提交
    在这里插入图片描述

  • 第二步:确认本端不受影响,保持老版本
    在这里插入图片描述

  • 第三步:执行git submodule update --remote更新
    在这里插入图片描述

  • 第四步:查看本地gitlink变化
    在这里插入图片描述
    接下来如果要提交就直接提交掉新的link

要点再回顾

  • 新增模块尽量用git submodule add xxx xxx来会自动处理不少事
  • 修改.gitmodules之后需要执行sync,然后update
  • update拉取远端的代码需要加上–remote,如果在.gitmodules中制定了分支会拉取对应分支,拉取后会修改本仓库的gitlink的commitid。如果本仓库要更新需要提交

综述

submodule的一些问题记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95737.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95737.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95737.shtml

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

相关文章

【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南

文章目录一、Seata 框架概述二、核心功能特性三、整体架构与三大角色1. Transaction Coordinator (TC) - 事务协调器&#xff08;Seata Server&#xff09;2. Transaction Manager (TM) - 事务管理器&#xff08;集成在客户端&#xff09;3. Resource Manager (RM) - 资源管理器…

AI赋能!Playwright带飞UI自动化脚本维护

80%的自动化脚本因一次改版报废&#xff1f; 开发随意改动ID导致脚本集体崩溃&#xff1f;背景UI自动化在敏捷开发席卷行业的今天&#xff0c;UI自动化测试深陷一个尴尬困局&#xff1a;需求迭代速度&#xff08;平均2周1次&#xff09;&#xff1e; 脚本维护速度&#xff08;平…

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南 1. 问题背景介绍 在分布式系统中&#xff0c;多节点并发访问共享资源时&#xff0c;如果不加锁或加锁不当&#xff0c;会导致数据不一致、超卖超买、竞态条件等问题。常见的分布式锁方案包括基于Redis、Zoo…

网络安全A模块专项练习任务十一解析

任务十一&#xff1a;IP安全协议配置任务环境说明&#xff1a; (Windows 2008)系统&#xff1a;用户名Administrator&#xff0c;密码Pssw0rd1.指定触发SYN洪水攻击保护所必须超过的TCP连接请求数阈值为5&#xff1b;使用组合键winR&#xff0c;输入regedit打开注册表编辑器&am…

金蝶中间件适配HGDB

文章目录环境文档用途详细信息环境 系统平台&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;5.6.5 文档用途 本文章主要介绍金蝶中间件简单适配HGDB。 详细信息 一、金蝶中间件Apusic安装与配置 1.Apusic安装与配置 Windows和Linux下安装部署过程相同。 &…

使用a标签跳转之后,会刷新一次,这个a标签添加的样式就会消失

<ul class"header-link"><li><a href"storeActive.html">到店活动</a></li><li><a href"fuwu.html">服务</a></li><li><a href"store.html">门店</a></l…

线程池实现及参数详解

线程池概述 Java线程池是一种池化技术&#xff0c;用于管理和复用线程&#xff0c;减少线程创建和销毁的开销&#xff0c;提高系统性能。Java通过java.util.concurrent包提供了强大的线程池支持。 线程池参数详解 1. 核心参数 // 创建线程池的完整构造函数 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(动态存储供应)

K8S 部署 NFS Dynamic Provisioning&#xff08;动态存储供应&#xff09; 本文档提供完整的 K8s NFS 动态存储部署流程&#xff0c;包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。 2. 部署步骤 2.1 创建命名空间 首先创建独立的命名空间 …

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:从RNN到LSTM与GRU

本文将深入探讨循环神经网络&#xff08;RNN&#xff09;的核心原理、其面临的长期依赖问题&#xff0c;以及两大革命性解决方案——LSTM和GRU的门控机制&#xff0c;并通过实例和代码帮助读者彻底理解其工作细节。1. 引言&#xff1a;时序建模的数学本质在上一篇概述中&#x…

Qt---状态机框架QState

QState是Qt状态机框架&#xff08;Qt State Machine Framework&#xff09;的核心类&#xff0c;用于建模离散状态以及状态间的转换逻辑&#xff0c;广泛应用于UI交互流程、设备状态管理、工作流控制等场景。它基于UML状态图规范设计&#xff0c;支持层次化状态、并行状态、历史…

GitHub 热榜项目 - 日榜(2025-09-02)

GitHub 热榜项目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 统计摘要 共发现热门项目&#xff1a;14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现AI Agent生态爆发趋势&#xff0c;Koog、Activepieces等项目推动多平台智能体开发框架成熟。语…

华为卫星对星引导技术深度解析:原理、实现与开源替代方案

利号&#xff1a;CNXXXXXX 涉及多传感器融合/自适应波束成形/轨道预测算法一、技术原理剖析&#xff1a;卫星间高精度指向的核心挑战在低轨卫星&#xff08;LEO&#xff09;星座中&#xff0c;卫星间链路&#xff08;ISL&#xff09;的建立面临三大技术难题&#xff1a;1. 动力…

水下管道巡检机器人结构设cad+三维图+设计说明书

目 录 1 绪论 1 1.1 选题的背景及意义 1 1.2 水下管道巡检机器人的分类 2 1.2.1 管道巡检技术的分类 2 1.2.2管道巡检机器人的分类 2 1.3 研究的现状 3 1.3.1 国内的研究现状 3 1.3.2 国外的研究现状 4 1.4 水下管道巡检机器人的发展趋势 5 1.…

[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法

引言 欢迎来到本系列的第十一篇&#xff01;在我们通过“最大深度”问题初步领略了树的递归之美后&#xff0c;今天我们将面对一个更能体现递归“分治”思想的经典问题——LeetCode 226. 反转二叉树。 这道题在面试界的地位非同凡响&#xff0c;它因 Homebrew 的作者 Max How…

Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客 “把对象的构造步骤拆成链式方法&#xff0c;调用者按需填参&#xff0c;最后一次性 build&#xff0c;避免构造函数爆炸。” 经典场景 参数多&#xff08;>4 个&#xff09;且大部分可选 需要不可变对象&#xff08;final 字段&#xf…

网页计时器,支持多计时器管理、数据分享、用户数据同步、全屏展示等功能,可进行倒计时、正计时和显示世界时钟。

一个具有现代化 UI 和交互的计时器网页应用&#xff0c;支持多计时器管理、数据分享、用户数据同步、全屏展示等功能&#xff0c;可进行倒计时、正计时和显示世界时钟。它采用玻璃态设计和流畅动画效果&#xff0c;提供极佳的视觉体验。 特点&#xff1a; 支持多个计时器的创建…

纹理融合——用 TypeScript + Babylon.js 打造“可混合纹理序列”

我不想搞个一新的Shader&#xff0c;我就想用已有的材质&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;实现纹理融合渐变等效果&#xff0c;于是我搞了一个TextureBlender。一、为什么重复造轮子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源码+数据集+部署教程】公交车部件实例分割系统源码和数据集:改进yolo11-fasternet

背景意义 随着城市化进程的加快&#xff0c;公共交通系统的需求日益增加&#xff0c;公交车作为城市交通的重要组成部分&#xff0c;其运行效率和安全性直接影响到城市的交通状况和居民的出行体验。因此&#xff0c;公交车的维护和管理显得尤为重要。在这一背景下&#xff0c;公…

【C++题解】关联容器

关于set&#xff0c;map以及变种 |关联容器| set&multiset | map&multimap |无序关联容器| Unordered set&multiset | Unordered map&multimap | 建议先了解之后再配合练习 这次练习CCF真题比较多&#xff0c;也比较基础&#xff0c;预计耗时不用这么久。 今天…