在主Git仓库当中新增子Git仓库的方式。

news/2025/3/26 14:24:44/文章来源:https://www.cnblogs.com/Vsonic12138/p/18762787

一、前言

目前在开发一个QT项目,需要搭配师兄的一个仓库代码进行使用。考虑到后续可能需要对这个子仓库代码进行更新,所以最好是让主仓库也可以跟踪这个子仓库的代码。

二、实现方法比较

实现子仓库Git跟踪的方式、优缺点介绍如下:

  1. Git子模块(Submodule)
  • 优点
    • 明确的仓库分离:子模块保持独立的版本控制,清晰显示为外部依赖
      版本精确锁定:主仓库引用子模块的特定提交,确保所有人使用完全相同的版本
      存储效率:主仓库只存储子模块的引用和路径,不包含子模块的实际内容
      独立更新:子模块可以单独进行更新和版本控制,不会影响主仓库
      权限分离:适合团队分工,不同人负责不同模块的场景
  • 缺点
    • 使用复杂性:需要学习额外的Git命令,操作流程较复杂
      克隆步骤增加:其他人克隆项目时需要额外的步骤初始化子模块 (--recursive 选项)
      更新不自动:子模块不会自动更新到最新版本,需要手动更新
      历史追踪困难:难以查看包含子模块变更的完整项目历史
  1. Git子树(Subtree)
  • 优点
    • 单一仓库体验:对于使用者来说,就像在操作单一仓库
      完整性:克隆主仓库时自动包含所有子树内容,不需要额外步骤
      历史完整:可以在主仓库中查看包含子树的完整历史
      简单使用:对大多数团队成员来说,不需要了解子树的存在
      向后兼容:可以与不了解子树的开发者协作
  • 缺点
    • 仓库体积增大:主仓库包含子树的全部内容,增加了仓库大小
      双向同步复杂:向原始子仓库贡献更改的流程较复杂
      合并冲突风险:当子树和主仓库同时修改时,可能产生复杂的合并冲突
      历史混合:子树的提交历史会混入主仓库的历史

三、Git子模块(Submodule)的使用方式

我目前选择Git子模块(Submodule)来进行子仓库的更新,Git子树(Subtree)的使用方式后续会编写博客进行记录。

1. 移除当前嵌入式仓库并添加为子模块

已知子仓库位于主仓库根目录的 lib/AIEngine/proj_ai_engine
步骤1:移除缓存中的嵌入式仓库(不会删除代码,只是删除缓存)

# 确保在主仓库根目录下
git rm --cached lib/AIEngine/proj_ai_engine

步骤2:添加子模块

# 使用子仓库的远程URL添加子模块
git submodule add <子仓库URL> lib/AIEngine/proj_ai_engine

步骤3:提交更改

git add .gitmodules lib/AIEngine/proj_ai_engine
git commit -m "Add proj_ai_engine as a submodule"

此时在主仓库的根目录下面就会有一个.gitmodules存在了。

2. 跟踪子仓库的分支,以“remotes/origin/feature/windows-support”分支为例子

步骤1:进入子模块目录

# 确保在主仓库根目录下
cd lib/AIEngine/proj_ai_engine

步骤2:拉取远程分支(如果本地没有)

首先,我们需要确认本地是否存在 feature/windows-support 分支。 如果不存在,我们需要从远程拉取。

git fetch origin

现在你可以看到 origin/feature/windows-support 分支。

步骤3:创建并检出本地分支 (如果不存在)
如果本地不存在 feature/windows-support 分支,则需要基于远程分支创建并检出该分支:

git checkout -b feature/windows-support origin/feature/windows-support

如果本地已经存在 feature/windows-support 分支,直接检出即可:

git checkout feature/windows-support

步骤4:设置跟踪关系
现在确保 feature/windows-support 分支已经检出,设置本地分支跟踪远程分支 origin/feature/windows-support

git branch --set-upstream-to=origin/feature/windows-support feature/windows-support

解释:

  • git branch --set-upstream-to=origin/feature/windows-support feature/windows-support: 这条命令将本地的 feature/windows-support 分支设置为跟踪远程的 origin/feature/windows-support 分支。 这意味着当你执行 git pull 时,它会从 origin/feature/windows-support 获取最新的更改。

步骤5:返回主仓库根目录

cd ../../.. #返回主仓库根目录

步骤6:暂存并提交主仓库的更改

git add .
git commit -m "Submodule lib/AIEngine/proj_ai_engine tracks feature/windows-support"

详细解释:

  1. 进入子模块: 确保你在正确的子模块目录下。
  2. 拉取远程分支: git fetch origin 拉取最新的远程分支信息,确保你知道有哪些可用的远程分支。
  3. 创建并检出本地分支: git checkout -b feature/windows-support origin/feature/windows-support 创建一个新的本地分支 feature/windows-support,并将其指向远程的 origin/feature/windows-support。 如果本地分支已经存在,则直接检出。
  4. 设置跟踪关系: git branch --set-upstream-to=origin/feature/windows-support feature/windows-support 是关键步骤,它告诉 Git,本地的 feature/windows-support 分支应该跟踪哪个远程分支。
  5. 提交更改: 提交主仓库的更改,这些更改记录了子模块所跟踪的特定提交(该提交对应于子模块中 feature/windows-support 分支的 HEAD 时刻)。

克隆后的操作:

当其他开发者克隆你的主仓库后,他们需要执行以下步骤:

git submodule init
git submodule update --init --recursive

或者更简洁的:

git submodule update --init --recursive

git submodule update --init --recursive 会初始化并更新子模块。 由于你在子模块内部设置了跟踪关系,所以当子模块被更新时,它会自动检出 feature/windows-support 分支,并跟踪远程的 origin/feature/windows-support 分支。

总结:

关键在于在子模块内部设置本地分支跟踪远程分支的关系。 这样,当其他开发者克隆你的仓库并更新子模块时,他们也会自动跟踪相同的远程分支。 .gitmodules 文件主要用于记录子模块的基本信息(路径、URL),而分支跟踪关系由子模块自身的 .git/config 文件管理。

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

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

相关文章

Gitee DevOps 实践指南:本土团队效率提升的新范式

在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,通过深度融合代码托管、CI/CD、项目管理等核心功能,为企业提供了本土化的 DevOps 解决方案。一、Gitee DevOps 的核心价值定位 在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,…

那些正常的动态规划

目录前言动态规划到底是啥?线性dp最长上升子序列子集和子序列和子串的区别内容分析最大上升子序列例题1——[NOIP2004 提高组] 合唱队形分析最长公共子序列最长公共子串平面dp例题2——[NOIP2000 提高组] 方格取数分析例题3——[NOIP2008 提高组] 传纸条分析例题4——最大加权…

3月24日刷题笔记-第六章 流量特征分析-常见攻击事件 tomcat

1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag 我们查看流量包,可以发现有一个外部IP在对常见端口进行SYN扫描,判断出为恶意IPflag{14.0.0.120} 2、找到攻击者IP后请通过…

如何在云效中使用 DeepSeek 等大模型实现 AI 智能评审

除了代码智能补全外,AI 代码智能评审是 DevOps 领域受开发者广泛关注的另一场景了。本文,我们将结合云效代码管理 Codeup、流水线 Flow 和 DeepSeek,分享一种企业可快速自主接入,即可实现的 AI 智能评审解决方案,希望给大家一些启发。作者:崔力强、黄博文 除了代码智能补…

T+0量化:JAVA接入Level2高频行情(附Python代码)

去年在知乎分享过一个网格策略,评论区全是"代码能跑通但实盘不敢用"的留言。当时我也一样——用第三方平台回测美滋滋,一到实盘就怂:行情延迟3秒、API调用次数受限、策略逻辑被平台规则卡脖子…直到把整套系统搬回本地,才发现自建交易系统的快感就像从合租屋搬进…

制作一个简单的带有3D打印部件的四足蜘蛛机器人

在这个项目中,我将向您展示如何使用3D打印部件制作一个简单的4腿行走蜘蛛机器人。该设计主要由上下板、臂接插件、腿和伺服支架五个部分组成。机器人的4条腿由4个手臂部分和4个腿部分组成。机器人的运动总共使用了8个业余伺服电机,4个在手臂上,4个在腿上。在电路方面,首选E…

统计学习之数据挖掘(结构数据)

统计学习之数据挖掘(结构数据):降维聚类关联度分析分类神经网络

2024 腾讯游戏安全大赛 mobile 初赛 wp

找关键结构体 https://www.cnblogs.com/revercc/p/17641855.html 找GWORLD https://bbs.kanxue.com/thread-280042.htm可以发现是 TEXT包裹的,utf-16编码,ida alt + b搜索 53 00 65 00 61 00 6D 00 6C 00 65 00 73 00 73 00 54 00 72 00即可网上翻即可找到 GWorld对应地址: 0…

制造业订单处理烦恼多,日事清 OTD 管理为您排忧解难

你是不是经常因为接单和交货时间差太大而焦头烂额?今天我们就结合制造业OTD管理,带您了解如何应用日事清进行订单交付全周期管理。日事清可以帮你设定精细的流程,从接单到发货,清晰可控地帮你解决以上烦心事。在制造业里打拼,每天都得面对各种烦心事,比如订单处理慢、生产…

如何在SSD1306上显示动态表情符号位图

解锁您的SSD1306上充满活力的视觉效果!学习毫不费力地显示动态表情符号位图,并以风格增强您的项目。 在本教程中,我们将通过使用PCBX在线模拟环境在SSD1306 OLED显示器上显示位图图像的过程。本教程将介绍设置PCBX模拟,格式化位图数据,配置显示大小和管理图像延迟。步骤1:…

redis基础数据结构——ZipList

ZipList 基于特殊写法实现的双端链表,由一系列特殊编码的连续内存块组成,可以像deque一样在双端压入/弹出,并且时间复杂度在O(1) 整体ZL结构如下zlbytes(uint32):当前zl总的byte数。 zltail(uint32):尾结点的offset,指向的是最后一个entry的起始地址。 zllen(uint16):记…