【Git教程】(二十)外包长历史记录 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

news2025/1/23 13:04:35

Git教程 · 外包长历史记录

  • 1️⃣ 概述
  • 2️⃣ 使用要求
  • 3️⃣ 执行过程及其实现
      • 3.1 外包项目历史
      • 3.2 链接到当前活动版本库

在这里插入图片描述

Git 版本库会随着时间积累越来越大,会影响它的内存管理效率。通常在版本库中只有源 代码文件情况下,这点效率影响可以忽略不计。在现有的磁盘效率和网络带宽条件下,这样的版本库并不显得过大。

但是,如果有大型的二进制文件(库文件、发布产物、测试数据库、图像文件)也在版本库中被管理,那么这个版本库的过大真的会带来负面影响。

和中央集中式的版本控制系统相比,分布式的版本库会消耗更多的计算传送资源。在克隆一个版本库时,所有的历史版本文件都会被复制。

本章工作流会演示如何外包过长的版本库历史记录,实现:

  • 新的项目版本库会占用较少的资源;
  • 依然可以使用 logblameannotate 命令搜索历史版本提交。

1️⃣ 概述

这段工作流包括三部分核心操作。

  • grafts 文件配置:通过 grafts 移植文件配置,删除本地版本库的父节点提交。
  • filter-branch 操作:使用 filter-branch 命令可以复制版本库中所有的提交并批量修改他们,修改后可以将原父节点关系可以被永远删除。
  • alternates 操作:通过 alternates 代替文件配置,链接不同版本库的提交。

在这里插入图片描述

如图上部所示本章示例项目版本库结构概况,有3个提交 A 、B 、C 。 其中 C 的历史将被移除作为演示。

首先,借助grafts命令,我们对提交C做修改,将其父节点提交删除。创建一个新的版本库,再使用 filter-branch 命令只得到修改后不含父节点的提交C。外包历史的操作就完成了。这些部署都只发生在新的项目中,所以之前的版本库可以作为档案留存。

为了搜索整个项目历史,档案版本库应被alternates命令链接到新的项目中,再使用grafts 命令,将提交C连接到正确的父节点(见图底部)。

2️⃣ 使用要求

  • 一致切断时:要求所有的项目成员一致同意并同步进行版本库历史切断操作,并在新的克隆上开展后续工作。
  • 项目历史罕有需要:当项目历史频繁被许多人查询使用时,应该接受它占用较多的资源,而不需要去执行外包操作。
  • 提交的散列值不被在意:Git提交的散列值可以被用来监测对旧版本未授权的更改。但是这样外包操作会切断历史,创建新的提交,使散列值改变。

3️⃣ 执行过程及其实现

这段工作流的目的是精简有过长历史,过多文件的版本库大小。旧的版本提交将被外包成一个独立的档案版本库,搜索历史操作依然可以执行。

3.1 外包项目历史

这段操作过程详细地描述了一个版本库历史如何被外包。更具体地来说,是建立一个新的版本库只含截断的版本历史。

注意! 原版本库的克隆在新的版本库中将不能使用。因此所有的开发修改工作都必须合并入中央版本库之后才进行外包操作,也应通知所有的开发者不再在原版本库的克隆上继续提交修改。

操作开始时项目结构如上图顶部所示。这个示例是一个简单的版本库,在主分支上有3次版本提交。新的项目版本库将从提交C开始创建。

通过下面这条log命令,我们得到了提交B和提交C的散列值。

> cd project.git
> git log --pretty=oneline
166a7e047a85b318720dc6e857a5321f9a3df7b4 C 
dcbddd5cd590de3d30elecca1882c9187e7eab95 B 
577b8e2cf613c43ed969453477fadc189482c1fb A

-pretty=oneline参数指定输出格式是同一条日志输出为一行,与-oneline参数指定的效果不同的是其结果中的散列值不会被截断。

  • 第1步:创建移植标签
    这是一步为集成档案版本库的准备工作。为了后续集成档案版本库的操作,需要预先知道历史前序节点的散列值。在上述示例中,就是提交B。较好的解决方案是在即将成为新项目第一个提交的C处创建一个标签(grafts/master),将这个散列值信息储存在标签注释中。

    这个标签会被带到新的项目版本库中。不应该将标签创建在提交B处,因为这个提交节点会被新项目版本库排除在外。

    创建命令tag可以标识提交C的散列值,也可以将提交B的散列值储存在标签描述中。

    > git tag -a grafts/master
    166a7e047a85b318720dc6e857a5321f9a3df7b4
    -m "Predecessor:dcbddd5cd590de3d30elecca1882c9187e7eab95"
    

    这里,grafts/master是新建的标签名。在Git中创建标签名和分支名时是允许使用斜线符号“/”来表示层次关系的。

    如果现实中项目有多个分支,那么需要在每个分支重复以上操作。这就是说需要为每一个分支分别决定在何处截断历史,并创建一个新的标签grafts/<branch-name>来储存前序提交节点信息。

  • 第2步:创建一个克隆
    接下来的操作会永久的更改版本库内容。因为我们仍需要保持原版本库不变以作为档案版本库,所以必须创建一个克隆版本库。另外这样会使待操作版本库成为没有工作空间的裸版本库,方可使用push命令。

    > cd ..
    > git clone --bare project.git temp-project.git
    
  • 第3步:通过grafts文件来转换历史
    现在开始在克隆版本库上删减版本历史。

    这步操作需要创建一个info/grafts文件并编辑它,文件info/grafts的格式十分简单。每一行标识一条提交的前序提交关系。因此只会依次记下当前提交的散列值、空格、前须提交的散列值。如果这一行的第二个散列值为空,那说明这次提交没有前序提交。

    在我们的示例中,提交C将没有前序提交。所以这一操作将创建一个新的grafts文件,并将提交C的散列值写入:

    > cd temp-project.git
    > echo 166a7e047a85b318720dc6e857a5321f9a3df7b4 >info/grafts
    

    如果正在操作的项目有多个分支,那么需要为那个分支增加一行。检查标识成功,可以用 log命令来查看。在我们的示例中,只会显示出提交C的信息。

    > git log --pretty=oneline
    166a7e047a85b318720dc6e857a5321f9a3df7b4 C
    
  • 第4步:永久性的改变版本库
    在通过 grafts 文件调整过后,可以用 filter-branch 命令创建一条新的永久提交。这条命令可以取得指定分支的所有提交,并按照规则过滤选取部分提交来重新提交。在本文示例中, 不需要设置特定的过滤器,因为这次提交的唯一目的是根据 grafts 文件修改提交历史。

    这里需要用到--tag-name-filter 参数,将已有的标签带到新的提交中。

    > git filter-branch --tag-name-filter cat ---all
    Rewrite 166a7e047a85b318720dc6e857a5321f9a3df7b4(2/2)
    Ref 'refs/heads/master' was rewritten
    Ref 'refs/tags/grafts/master' was rewritten
    WARNING: Ref 'refs/tags/release-1' is unchanged
    Ref 'refs/tags/release-2' was rewritten
    grafts/master -> grafts/master
    (166a7e047a85b318720dc6e857a5321f9a3df7b4 -> 259ee224ac1f2d73898ec2ed25ad4dccd3c40f70) 
    release-1 -> release-1
    (577b8e2cf613c43ed969453477fadc189482clfb -> 577b8e2cf613c43ed969453477fadc189482clfb)
    release-2 ->release-2  
    (166a7e047a85b318720dc6e857a5321f9a3df7b4 -> 259ee224ac1f2d73898ec2ed25ad4dccd3c40f70)
    

    参数配置如下所示。

    • --tag-name-filter cat: 表示所有的标签都讲重新创建并指向新的提交。
    • -all: 表示作用于版本库中所有的分支。


    可以看到 filter-branch 的输出结果显示散列值为 166a7 的提交C 被选取并重新提交为散列值 259ee。

    在输出中可以看到一条警告 (warning), 名为 release-1 的标签不符合新的提交历史。因为在调整前的版本库中该标签绑定到了提交A。现在提交A 已经不存在与新的提交历史中了。

    这些标签需要手动删除,否则他们最终会影响Git 删除相应的版本提交操作。

     > git tag -d release-1
    
  • 第5步:缩小版本库
    在这个阶段,版本库已经完成转换新历史记录的整理。但是 filter-branch 命令尚未删除不再需要的旧版本提交,原因是他们还被引用着。因此版本库并没有比整理前缩小。
    再次克隆版本库,会得到一个只包含新历史的版本库。之后,可以删除上述操作中产生的中间临时版本库。

    > git clone --bare temp-project.git new-project.git
    > rm -rf temp-project.git
    

    新的版本库可以使用 gc 命令压缩。这一操作会执行各种清理删除工作,其中包括压缩新文件,删除它指向不可用对象的引用。

    > cd new-project.git
    > git gc --prune
    

    参数 --prune 表明所有所有文件不再需要的旧版本都必须被清除。

    至此,新的版本库开始对所有开发者可用,供克隆和使用。

3.2 链接到当前活动版本库

如果仍需要接触历史版本信息,当前版本库必须链接到档案版本库。这只是一条本地链接,可以被每个开发者独立使用激活。
以下步骤中,假设一个开发者已有对新版本库的克隆,并有了一条新的版本提交 D 。

  • 第1步:克隆档案版本库
    为了得到历史信息,需要克隆档案版本库。因为档案版本库不再有开发工作,裸 (bare)克隆即可。
> git clone --bare project.git archive-project.git
  • 第2步:链接档案版本库
    档案版本库的提交需要在开发者本地版本库中设置为可用。

    为了在一个版本库中读取其他版本库,需要在 .git/objects/info/alternates 文件中设定候选路径。该文件中每行都指向其他版本库中对象的绝对路径。

    请注意,必须指向该对象的文件目录,仅仅指向该对象所在的版本库根目录是不够的。
    使用echo 命令在该文件中添加新的一行候选路径。

    > cd new-project
    > echo /gitrepos/archive-project.git/objects
    >> .git/objects/info/alternates
    
  • 第3步:连接到历史版本
    最后,使用上文已经熟悉使用过的.git/info/grafts 文件,将提交C '链接到档案版本库的提交B。
    这种情况下, grafts 文件中准备好的标签将有效的提供链接必须的信息。(参见外包项目 历史第一步操作)。

    > git show grafts/master --pretty=oneline
    > tag grafts/master
    Predecessor: dcbddd5cd590de3d30elecca1882c9187e7eab95
    259ee224ac1f2d73898ec2ed25ad4dccd3c40f70 C
    diff --git a/foo.txt b/foo.txt
    

    可以看到两个提交的散列值,第一个 dcbdd 指向了正确的历史前序提交 B, 第二个 259ee 指向当前版本库最新的提交C。
    在 grafts 文件中散列值应该是倒序。第一个是提交 C’, 接下来空格,和前序提交 B。

    > echo 259ee224aclf2d73898ec2ed25ad4dccd3c40f70 \
    	dcbddd5cd590de3d30eleccal882c9187e7eab95 \
    	> .git/info/grafts
    

    为了验证以上操作效果,可以用log 命令,查看输出的记录将包括提交A 和提交B。

    > git log --pretty=oneline
    da8ba94d6bd9ec293f22a558756a91927f8b3525  D
    259ee224ac1f2d73898ec2ed25ad4dccd3c40f70   C
    dcbddd5cd590de3d30elecca1882c9187e7eab95  B
    577b8e2cf613c43ed969453477fadc189482clfb     A
    

    至此,所有的历史信息都可以在当前开发版本库使用。

为什么不获取档案版本库(而是采用链接) ?
本章工作流步骤描述了使用 objects/info/alternates 文件来配置链接到版本提交。另外一种解决方案是通过fetch命令来获取导入这些版本提交,然后同样可以通过grafts文件配置创建提交之间的父子关系。

尽管如此,本章工作流更适用于较少的频率临时性的使用历史信息,在这种情况下,使用 alternates 文件来配置更有效率,因为本方案不会增加提交数,扩大当前版本库。



温习回顾上一篇(点击跳转)
《【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~》

继续阅读下一篇(点击跳转)
《》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新火种AI|倒反天罡!美国名校斯坦福AI团队抄袭中国大模型

作者&#xff1a;一号 编辑&#xff1a;美美 中国大模型被抄袭&#xff0c;怎么不算是某种层面上的国际认可呢&#xff1f; 5月29日&#xff0c;斯坦福大学的一个AI研究团队发布了一个名为「Llama3V」的模型&#xff0c;号称只要 500 美元就能训练出一个 SOTA 多模态模型&am…

精酿啤酒新风尚,FENDI CLUB盛宴启幕,品质生活触手可及

随着现代人对生活品质的追求日益提升&#xff0c;精酿啤酒作为一种新兴的生活方式&#xff0c;正逐渐引领潮流。在这个背景下&#xff0c;FENDI CLUB的盛宴盛大开启&#xff0c;为广大消费者带来了一场别具一格的品质生活体验。 一、精酿啤酒的崛起 精酿啤酒以其独特的口感、…

手机卡不缴纳违约金就不给注销?实用的处理方法大全!

我手机卡都不用了&#xff0c;为何不能注销&#xff1f;而且要缴纳违约金&#xff1f;简直是无法无天&#xff01;小编在回复粉丝问题的时候&#xff0c;经常遇到这种情况&#xff0c;现在就给大家系统整理下如何处理这个问题&#xff0c;希望能帮助到大家&#xff01; 在处理不…

段子照进现实!裁员裁到大动脉,理想被传召回被裁员工…?

你一定看过类似这样的段子吧&#xff01;「公司高层换血&#xff0c;各个部门丢裁了个遍&#xff0c;终于要对财务下手&#xff0c;财务总监走之前&#xff0c;让公司补了六百万税」 还有类似这样的&#xff1a;「某公司裁员把一个销售主管裁了&#xff0c;那销售上午刚谈了个1…

vue动态加载组件import引入组件找不到组件(Error: Cannot find module)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

【杂谈】AIGC之Stable Diffusion:AI绘画的魔法

Stable Diffusion&#xff1a;AI绘画的魔法 引言 在AI的世界里&#xff0c;Stable Diffusion就像一位魔法师&#xff0c;它能够将我们脑海中的幻想&#xff0c;用画笔一一描绘出来。今天&#xff0c;就让我们一探这位魔法师的奥秘&#xff0c;看看它是如何从无到有&#xff0…

Java驱动的工程项目管理系统:实现高效协作与精准管理

在工程行业的现代管理实践中&#xff0c;有效地协同工作和信息共享对于提高工作效率和降低成本至关重要。本文将深入探讨一款基于Java技术的工程项目管理系统&#xff0c;该系统采用前后端分离的架构&#xff0c;功能全面&#xff0c;旨在满足不同角色的需求&#xff0c;从项目…

【一小时学会Charles抓包详细教程】Charles 弱网测试与实战篇 (10)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 Charles 弱网测…

Message forwarding mechanism (消息转发机制)

iOS的消息转发机制 iOS的消息转发机制是在消息发送给对象时&#xff0c;找不到对应的实例方法的情况下启动的。消息转发允许对象在运行时处理无法识别的消息&#xff0c;提供了一种动态的、灵活的消息处理方式。 消息转发机制主要分为三个阶段&#xff1a; 动态方法解析快速…

基于振弦采集仪的土木工程安全监测技术研究

基于振弦采集仪的土木工程安全监测技术研究 随着土木工程的发展&#xff0c;安全监测成为了非常重要的一部分。土木工程的安全监测旨在及早发现结构的变形、位移、振动等异常情况&#xff0c;以便及时采取措施进行修复或加固&#xff0c;从而保障工程的安全运行。振弦采集仪作…

2024第26届大湾区国际电机博览会暨发展论坛

2024第二十六届大湾区国际电机博览会 暨发展论坛 2024第26届大湾区国际电机博览会暨发展论坛 The 26th Greater Bay Area International Motor Expo and Development Forum 时间&#xff1a;2024年12月4-6日 地址&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#x…

【Vue】普通组件的注册使用-全局注册

文章目录 一、使用步骤二、练习 一、使用步骤 步骤 创建.vue组件&#xff08;三个组成部分&#xff09;main.js中进行全局注册 使用方式 当成HTML标签直接使用 <组件名></组件名> 注意 组件名规范 —> 大驼峰命名法&#xff0c; 如 HmHeader 技巧&#xf…

zdppy_api 中间件请求原理详解

单个中间件的逻辑 整体执行流程&#xff1a; 1、客户端发起请求2、中间件拦截请求&#xff0c;在请求开始之前执行业务逻辑3、API服务接收到中间件处理之后的请求&#xff0c;和数据库交互&#xff0c;请求数据4、数据库返回数据5、API处理数据库的数据&#xff0c;然后给客户…

【线性代数】SVDPCA

用最直观的方式告诉你&#xff1a;什么是主成分分析PCA_哔哩哔哩_bilibili 奇异值分解singular value decomposition&#xff0c;SVD principal component analysis,PCA 降维操作 pca就是降维后使得信息损失最小 投影在坐标轴上的点越分散&#xff0c;信息保留越多 pca的实现…

Springboot二屯村钓鱼场管理系统的设计-计算机毕业设计源码58167

摘 要 在互联网时代的来临&#xff0c;电子商务的骤起&#xff0c;一时间网络进行购物这一形式备受欢迎&#xff0c;到现在&#xff0c;网购更是普及。现如今各个行业也通过网购的方式来进行拓展业务&#xff0c;增加企业的知名度以及提升业绩&#xff0c;满足了用户像网购一样…

懒人开发者的福音,轻松开发应用无需搭建服务!

近日&#xff0c;一款轰动开发圈的神器正以“太硬核了&#xff01;疯传开发圈&#xff01;”的口碑迅速走红&#xff0c;那就是Memfire Cloud&#xff01;这款一站式开发应用&#xff0c;不仅让懒人开发者尽享便利&#xff0c;更为开发者们带来了前所未有的开发体验。 对于懒人…

windows操作系统提权之服务提权实战rottenpotato

RottenPotato&#xff1a; 将服务帐户本地提权至SYSTEM load incognito list_tokens –u upload /home/kali/Desktop rottenpotato.exe . execute -Hc -f rottenpotato.exe impersonate_token "NT AUTHORITY\SYSTEM" load incognito 这条命令用于加载 Metasploi…

【安装笔记-20240529-Windows-Wireshark 网络协议分析工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Wireshark 网络协议分析工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Wireshark 网络协议分析工具 前言一、软件介绍名称&#xff1a;Wireshark主页官方介绍 二、安装步骤测试版本&#xff1a;Wireshark-4…

力扣11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例 …

vscode编译文件夹下所有文件的配置(包含插件和 .json 文件)

文章目录 我所使用的插件.json 文件配置1. c_cpp_properties.json2. launch.json3. settings.json4. tasks.json 如何运行 我所使用的插件 红框中的五个插件是必备的&#xff0c;其中 Code Runner 插件可以在写完一个 .c 或 .cpp 文件后&#xff0c;按下 Crtl R 快捷键快速编…