git子模块
1 子模块管理的关键文件和配置
在 Git 中使用子模块时,Git 会利用几个特殊的文件和配置来管理子模块。以下是涉及子模块管理的关键文件和配置:
1.1 .gitmodules
- 这是一个文本文件,位于 Git 仓库的根目录下。
- 它记录了子模块的信息,包括每个子模块的路径、URL 和分支。
- 这个文件应该被添加到版本控制中,以便其他克隆了主仓库的人也能获取和初始化子模块。
示例 .gitmodules
文件内容:
[submodule "AIGC/opencompass"]path = AIGC/opencompassurl = https://github.com/open-compass/opencompass.gitbranch = master
1.2 .git/config
- 这是 Git 仓库的本地配置文件。
- 它也包含有关子模块的信息,通常在运行
git submodule init
时,子模块的信息会从.gitmodules
被复制到.git/config
中。 .git/config
文件存储的子模块信息是本地特有的,不会被推送到远程仓库。
1.3 .git/modules
- 这是存储子模块 Git 仓库数据的目录。
- 当您初始化子模块时,Git 会在这个目录下创建一个子目录来存储每个子模块的 Git 数据(例如对象、引用等)。
- 这个结构使得主仓库能够维护干净的目录结构,同时保持子模块作为独立仓库的数据。
1.4 子模块目录
- 子模块的实际内容被克隆到主仓库的子目录中,该目录由
.gitmodules
中的path
指定。 - 子模块目录内部会有一个
.git
文件,该文件指向实际的 Git 数据存储位置,通常是../../.git/modules/path/to/submodule
。
1.5 处理子模块的 Git 命令
虽然这些不是文件,但了解相关的 Git 命令对于管理子模块同样重要:
git submodule add <url> <path>
:添加新的子模块。git submodule init
:初始化子模块,即将.gitmodules
中的信息复制到.git/config
。git submodule update
:更新子模块到在主仓库中记录的特定提交。git submodule update --init --recursive
:递归地初始化并更新子模块及其所有嵙套的子模块。
通过正确使用这些文件和命令,可以有效地管理包含子模块的 Git 仓库。这对于包含第三方依赖或库的项目尤其重要。
2 子模块和主仓库的提交
需要分开处理当您在一个包含子模块的 Git 仓库中修改了子模块的内容,不能直接使用 git commit -a -m 'XXX
来提交主仓库和子模块的变更。这是因为子模块在 Git 中被视为独立的仓库,它们有自己的独立版本历史。
2.1 提交子模块的变更
首先,您需要进入子模块的目录,并对子模块内的变更进行提交:
cd AIGC/opencompass # 进入子模块目录
git add . # 添加所有变更到暂存区
git commit -m "Describe changes made in the submodule"
这一步确保了子模块的变更被记录在子模块的版本历史中。如果您尝试在主仓库中使用 git commit -a
,它只会记录子模块的新提交引用,而不会提交子模块内部的实际文件变更。
2.2 提交主仓库的变更
返回到主仓库目录,提交子模块的新状态(这实际上是子模块的新提交哈希)到主仓库:
cd ../.. # 返回到主仓库根目录
git add AIGC/opencompass # 将子模块的新状态添加到暂存区
git commit -m "Update submodule reference to the latest commit"
这一步是必要的,因为虽然子模块的内容已经在子模块的仓库中被提交,但是主仓库需要更新其记录的子模块的引用(即子模块的提交哈希),以反映子模块的最新状态。
3.3 推送变更
完成以上步骤后,推送主仓库和子模块的变更到远程仓库:
git push origin master # 推送主仓库变更
cd AIGC/opencompass # 再次进入子模块
git push origin master # 推送子模块变更
3 清理并重新添加子模块(如果需要)
3.1 清理子模块
git submodule deinit -f AIGC/opencompass
rm -rf .git/modules/AIGC/opencompass
git rm -f AIGC/opencompass
git add .
git commit -m "Remove submodule"
3.2 重新添加子模块
git submodule add https://github.com/open-compass/opencompass.git AIGC/opencompass
git submodule update --init --recursive
4 管理远程仓库拉取更新并推送到另一个远程仓库的子模块
要按照以下步骤操作:
4.1确保子模块正确初始化和更新
首先,确保子模块已经正确初始化并链接到正确的远程仓库。
cd AIGC/opencompass
git submodule update --init
4.2 将子模块的远程仓库设置为 GitHub
进入子模块目录,并将其远程仓库设置为 GitHub 上的 URL。
cd AIGC/opencompass
git remote add upstream https://github.com/open-compass/opencompass.git
这里使用 upstream
作为远程仓库的名称,表示原始源头仓库。如果 upstream
已经存在,您可能需要先用 git remote remove upstream
删除旧的远程配置。
4.3 从 GitHub 拉取最新更新
从 GitHub 的仓库拉取最新的更新到本地。
git fetch upstream
git checkout master # 或者您需要同步的分支
git merge upstream/master
处理可能出现的合并冲突,并提交这些更改。
4.4 推送更新到您的公司仓库
将更新后的内容推送到公司的远程仓库。首先确认您有权限推送到该仓库,并且已经设置了正确的远程仓库地址。
git remote add origin ssh://100@10.95.243.146:29418/SystemTestDep/TestTestToolSoftware/jingzhun/AIGC/opencompass
git push origin master
这里使用 origin
作为远程仓库的名称,如果已经设置了不同的仓库地址,可能需要更新或使用不同的远程名称。
4.5 确保主项目中的子模块引用更新
回到主项目目录,更新子模块的引用并提交这些更改。
cd ../..
git add AIGC/opencompass
git commit -m "Update submodule reference to the latest commit"
git push
这确保了主项目引用了子模块的最新提交。
4.6 注意事项
-
合并冲突:在合并 GitHub 上的更改时,您可能会遇到冲突。确保仔细解决所有冲突,并在本地测试所有更改以确保一切功能正常。
-
权限:确保您拥有所有远程仓库的推送权限。如果不确定,与您的系统管理员确认。
-
验证远程 URL:使用
git remote -v
查看远程仓库的 URL 是否正确设置。
通过这些步骤,您可以有效地管理涉及多个远程仓库的子模块更新和推送操作。
5 错误信息 fatal: 远程 origin 已经存在
表示 Git 仓库中已经有一个名为 origin
的远程仓库配置。如果您想更改 origin
的 URL 或者添加一个新的远程仓库,您可以采取以下几个不同的步骤:
5.1 查看当前的远程仓库配置
首先,检查现有的 origin
远程仓库配置,看看它指向哪里:
git remote -v
这会显示所有远程仓库的名称及其对应的 URL。
5.2 更改现有的远程仓库 URL
如果您想要更改已存在的 origin
远程仓库的 URL,可以使用以下命令:
git remote set-url origin ssh://100@10.95.243.146:29418/SystemTestDep/TestTestToolSoftware/jingzhun/AIGC/opencompass
这个命令会更新 origin
的 URL 到新的地址。
5.3 移除并重新添加远程仓库
如果您想完全重新配置 origin
,可以先删除现有的远程仓库,然后再添加新的:
git remote remove origin
git remote add origin ssh://100@10.95.243.146:29418/SystemTestDep/TestTestToolSoftware/jingzhun/AIGC/opencompass
这将删除旧的 origin
并用新的 URL 添加它。
5.4 添加一个不同名称的远程仓库
如果您想保留 origin
并添加另一个远程仓库,可以选择一个不同的名称:
git remote add another-origin ssh://100@10.95.243.146:29418/SystemTestDep/TestTestToolSoftware/jingzhun/AIGC/opencompass
这样,您可以有多个远程仓库配置,可以自由地推送和拉取到不同的远程仓库。
6 在主工程中包含一个第三方库作为子目录同时保留所做的修改并定期更新
6.1 使用 Git 子模块(Submodule)
Git 子模块允许您将一个Git仓库作为另一个Git仓库的子目录,它可以在主仓库中保持自己的独立版本历史。
优点:
- 子模块和主仓库独立管理,易于跟踪第三方库的更新。
- 可以选择性地更新子模块,同时保持对子模块的更改。
操作步骤:
- 将第三方库作为子模块添加到您的主工程中:
git submodule add <repository-url> <path/to/submodule>
- 当第三方库有更新时,您可以进入子模块目录,拉取最新的更改:
cd <path/to/submodule> git pull origin master # 假设您关注的是 master 分支
- 解决可能出现的合并冲突,确保您的修改得以保留。
- 提交更新到主仓库,包括子模块的新提交引用:
cd <path/to/main/project> git add . git commit -m "Update submodule to latest version"
6.2 使用 Git 子树(Subtree)
Git 子树允许您将第三方库合并到您的主仓库中,作为项目的一部分处理,同时仍然能够从上游库拉取更新。
优点:
- 子树是主仓库的一部分,不需要初始化或更新子模块。
- 方便同时提交对主仓库和子树的更改。
操作步骤:
- 将第三方库作为子树添加到您的主工程中:
git subtree add --prefix <path/to/subtree> <repository-url> master --squash
- 拉取并合并第三方库的更新:
git subtree pull --prefix <path/to/subtree> <repository-url> master --squash
- 解决合并中出现的冲突,保留您的更改。
- 提交更新到您的主仓库。
6.3 简单嵌套的方式
将一个第三方库的Git仓库简单地克隆到您的主仓库的子目录中,但不使用Git的子模块或子树功能,确实是一种可行的方法,特别是如果您想保持操作的简便性。简单嵌套的方式在操作上可能更直接,特别是对于小型项目或者不需要频繁同步第三方库更新的情况。然而,如果第三方库更新频繁,或者需要精确追踪第三方库的变更,使用Git子模块或子树可能是更好的选择,因为这些方法提供了更好的工具来管理和集成外部库的更新。
优点
- 简单易懂:不需要配置子模块或子树,对Git新手来说更加直观。
- 独立操作:第三方库完全独立于主仓库,可以单独进行版本控制和管理。
缺点
- 更新复杂:当第三方库需要更新时,需要手动处理可能出现的合并冲突,并确保自己的修改不会被覆盖。
- 版本跟踪不便:主仓库无法直接追踪子目录库的版本变化,不易管理子目录库的具体版本。
- 忽略处理:为了防止主仓库对子目录进行版本控制,可能需要在
.gitignore
中添加规则来忽略子目录。
如果选择简单嵌套的方式,以下是一个基本的操作流程:
-
克隆第三方库到子目录
cd path/to/your/main/project git clone https://github.com/third-party/library path/to/subdirectory
-
在主项目的
.gitignore
文件中忽略该子目录 (可选)# .gitignore path/to/subdirectory/
-
定期更新第三方库
- 进入子目录,拉取最新的更新:
cd path/to/subdirectory git pull origin master
- 解决可能出现的合并冲突,并确保您的修改被适当地合并。
- 进入子目录,拉取最新的更新:
-
将修改提交到第三方库的本地或远程分支(如果有权限)
git add . git commit -m "Your custom changes" git push origin your-branch
相关文章:
git子模块
1 子模块管理的关键文件和配置 在 Git 中使用子模块时,Git 会利用几个特殊的文件和配置来管理子模块。以下是涉及子模块管理的关键文件和配置: 1.1 .gitmodules 这是一个文本文件,位于 Git 仓库的根目录下。它记录了子模块的信息ÿ…...

stm32编写Modbus步骤
1. modbus协议简介: modbus协议基于rs485总线,采取一主多从的形式,主设备轮询各从设备信息,从设备不主动上报。 日常使用都是RTU模式,协议帧格式如下所示: 地址 功能码 寄存器地址 读取寄存器…...

基于 Transformer 的大语言模型
语言建模作为语言模型(LMs)的基本功能,涉及对单词序列的建模以及预测后续单词的分布。 近年来,研究人员发现,扩大语言模型的规模不仅增强了它们的语言建模能力,而且还产生了处理传统NLP任务之外更复杂任务…...

证照之星是一款很受欢迎的证件照制作软件
证照之星是一款很受欢迎的证件照制作软件,证照之星可以为用户提供“照片旋转、裁切、调色、背景处理”等功能,满足用户对证件照制作的基本需求。本站证照之星下载专题为大家提供了证照之星电脑版、安卓版、个人免费版等多个版本客户端资源,此…...

不定时更新 解决无法访问GitHub github.com 打不开 dns访问加速
1 修改hosts Windows 10为例,文件C:\Windows\System32\drivers\etc\hosts 管理员打开记事本来修改 文件-打开-“C:\Windows\System32\drivers\etc\hosts” 20.205.243.168 api.github.com 185.199.108.154 github.githubassets.com 185.199.108.133 raw.githubusercontent.…...
单向环形链表的创建与判断链表是否有环
单向环形链表的创建与单向链表的不同在于,最后一个节点的next需要指向头结点; 判断链表是否带环,只需要使用两个指针,一个步长为1,一个步长为2,环状链表这两个指针总会相遇。 如下示例代码: l…...

JVM堆栈的区别、分配内存与并发安全问题、对象定位
一、堆和栈的区别 堆(Heap)和栈(Stack)是两种基本的数据结构,它们在内存管理、程序执行流程控制等方面扮演着重要角色。在编程语言尤其是Java这样的高级语言环境中,堆和栈的概念被用来描述程序运行时的内存…...
Python教程:机器学习 - 百分位数(4)
什么是百分位数? 统计学中使用百分位数(Percentiles)为您提供一个数字,该数字描述了给定百分比值小于的值。 例如:假设我们有一个数组,包含住在一条街上的人的年龄。 ages [5,31,43,48,50,41,7,11,15,3…...

数据结构习题(快期末了)
一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。 从逻辑关系上讲,数据结构主要分为线性结构和非线性结构两类。 数据的存储结构是数据的逻辑结构的存储映像。 数据的物理结构是指数据在计算机内实际的存储形式。 算法是对解题方法和…...
Http协议:Http缓存
文章目录 Cookie和Session缓存有效性检查整体流程总结Cookie和Session Cookie 客户端的缓存 Session 服务端的缓存,存储服务器与客户端一次会话的过程中的数据/资源 两者区别 是服务端与客户端的不同需求造成的 有效期 Cookie的有效期很长,Session的较短 原因:服务…...

idea插件开发之hello idea plugin
写在前面 最近一直想研究下自定义idea插件的内容,这样如果是想要什么插件,但又一时找不到合适的,就可以自己来搞啦!这不终于有时间来研究下,但过程可谓是一波三折,再一次切身体验了下万事开头难。那么&…...

Sm4【国密4加密解密】
当我们开发金融、国企、政府信息系统时,不仅要符合网络安全的等保二级、等保三级,还要求符合国密的安全要求,等保测评已经实行很久了,而国密测评近两年才刚开始。那什么是密码/国密?什么是密评?本文就关于密…...

git如果将多次提交压缩成一次
将N个提交压缩到单个提交中有两种方式: git reset git reset的本意是版本回退,回退时可以选择保留commit提交。我们基于git reset的作用,结合新建分支,可以实现多次commit提交的合并。这个不需要vim编辑,很少有冲突。…...
android用Retrofit进行网络请求和解析
Retrofit 的原理 Retrofit的核心原理包括动态代理与Service Method的构建、注解解析与请求配置、网络请求执行与响应处理等。它是一个类型安全的HTTP客户端,用于Android和Java平台,通过将HTTP API转化为Java接口的方式,简化了网络请求的编写…...

list容器的基本使用
目录 前言一,list的介绍二,list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插,头删,尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear 前言 list中的接口比较多,与string和vector类似&am…...

34万汉语词语成语反义词ACCESS\EXCEL数据库
反义词就是两个意思相反的词,包括:绝对反义词和相对反义词。分为成对的意义相反、互相对立的词。如:真——假,动——静,拥护——反对。这类反义词所表达的概念意义互相排斥。或成对的经常处于并举、对待位置的词。如&a…...
yum方式更新Jenkins
目的 使用yum方式更新Jenkins。 步骤 查看最新可用版本 $ yum list jenkins Last metadata expiration check: 0:03:44 ago on Fri Jun 14 06:10:01 2024. Installed Packages jenkins.noarch 2.452.1-1.1 jenkins Available Pa…...

欢乐钓鱼大师保姆级教程,云手机辅助攻略解析!
在这份攻略中,我们将为大家详细介绍如何在《欢乐钓鱼大师》中快速提升钓鱼技能和游戏进展,避免常见的新手误区和不必要的资源浪费。无论是钓鱼点的选择、装备的合理使用还是技能的优化,我们都会一一为您详细解析,帮助您成为一名优…...

数据结构:手撕代码——顺序表
目录 1.线性表 2.顺序表 2.1顺序表的概念 2.2动态顺序表实现 2.2-1 动态顺序表实现思路 2.2-2 动态顺序表的初始化 2.2-3动态顺序表的插入 检查空间 尾插 头插 中间插入 2.2-4 动态顺序表的删除 尾删 头删 中间删除 2.2. 5 动态顺序表查找与打印、销毁 查找 …...

jenkins使用注意问题
1.在编写流水线时并不知道当前处在哪个目录,导致名使用不当,以及文件位置不清楚 流水线任务默认路径是,test4_mvn为jenkins任务名 [Pipeline] sh (hide)pwd /var/jenkins_home/workspace/test4_mvn maven任务也是,看来是一样的…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...