git 对象压缩及垃圾对象清理

news2024/9/27 21:22:15

git 对象压缩及垃圾对象清理

这篇文章让我们来看看 git 的对象压缩机制,前面的几篇文章我们提到,在执行 git add 命令会会把文件先通过 zlib 压缩后放入到「暂存区」,我们先看看这个步骤:

我们这个实例中有一个 1.28m 的 index.js 文件:

在这里插入图片描述

初始化一个仓库,然后执行 git add . 命令把文件添加到「暂存区」,在 04-git 中的概念 文章里我们说过这个命令会生成一个「blob 对象」(也就是在一个 .git/objects 文件中生成一个经过 zlib 压缩的文件):

在这里插入图片描述
在这里插入图片描述

从上图可以看到 index.js 文件体积明显减少了很多,能帮我们节省磁盘空间,而通过 git cat-file <hashId> 就可以查看源文件。

我们先执行一下 commit,此时就会生成一个「tree 对象」和一个「commit 对象」,因为这两个文件存储的是索引,所以非常小。

在这里插入图片描述
在这里插入图片描述

如果我们稍微修改 index.js 文件中的几个字符在重新执行 git add . 命令看看会发生什么:

在这里插入图片描述

可以很明显的看到又多一个差不多大小的文件,我们可以设想到如果我们的原始文件很大,或者执行了非常多次的 add、commit 命令,这个 objects 文件将变得非常大:

在这里插入图片描述
在这里插入图片描述

但是我们的「工作目录」才只有一个 1.28m 的文件,同时每次只是修改了几个字符,对比起来 .git 文件是不是太大了(上图只执行了4次的add、commit操作,当文件多了会更明显)。针对这个问题 Git 提供了一个命令: git gc,这个命令可以把 Git 对象进行压缩。

在这里插入图片描述

在经过 dalta 压缩后,GIt 对象(.git/objects文件中的文件)都会被删除,同时在 .git/objects/pack 文件夹中生成相应的压缩文件:

在这里插入图片描述
在这里插入图片描述

可以看到经过压缩后 .git/objects 文件夹体积又变小了,

.pack 文件体积较大,我们可以很明显猜到这就是存储我们文件的地方,而 .idx 文件储存的就是索引,因为 .git/objects 文件夹里的对象都清除了,但是我们还是可以通过执行 git log 或者其他命令获取到对象相关的信息:

在这里插入图片描述

通过 cat-file 命令还是能查看到「commit 对象」、「tree 对象」、「blob 对象」:

在这里插入图片描述

通过这个 .idx 文件我们就能快速到找到 .pack 文件中对应的 commit 或者 blob的内容。

查看压缩文件

我们可以通过 git verify-pack -v <fileName> 命令来查看压缩文件:

在这里插入图片描述

从上图可以看到,.pack 文件保存了之前 add、commit 生成的「commit 对象」、「tree 对象」、「blob 对象」。我们来重点看看标注的地方:

黄色框内的数字就是文件的大小及压缩等信息,红色线就是第一次add的生成的「blob 对象」,蓝色线就是之后3次 add 生成「blob 对象」,后面同时还带上了第一次add的生成的「blob 对象」,说明记录的只是文件的差异,因此在经过压缩后 .git/objects 文件大小会明显降低。

压缩的作用

在传输过程中减少带宽,减少本地磁盘的占用空间。

我们在执行 push 的时候,推送的就是压缩的 pack 文件(减少带宽,较少上传时间),但是我们本地的仓库并没有被压缩:

在这里插入图片描述

我们来看一个更明显的例子,拉取 vue 的代码:

git clone git@github.com:vuejs/vue.git

在这里插入图片描述

可以看到有 62255 个对象,.git 文件大小为 31.51MB。

在这里插入图片描述

从 .git/objects 文件中也可以看到下载的对象都是经过压缩的。 Git 也提供了一个 unpack-objects 命令来帮助我们把对象解压出来。

不过我们不能直接把 .git/objects/pack 文件夹中的 .pack 文件进行解压,需要移动到其他文件夹中:

在这里插入图片描述

在上图中我们把 .pack 文件移动到 .git 目录下:

在这里插入图片描述
之后执行解压缩命令 git unpack-objects < .git\pack-6abcda5b8a6ba30f796c774e6177e10757ff9865.pack :

在这里插入图片描述

可以看到相比起压缩的 .pack 文件,解压出来的对象占用空间更大,如果我们 clone 仓库的时候,对象没有压缩,那么我们将耗费更多的带宽及下载时间。

垃圾对象清理

我们在执行一些 Git 操作的时候,会生成一些「blob 对象」等,这些没有被引用的对象就是垃圾对象。

什么意思呢,比如我们重复修改一个文件,每次修改后都执行 add 命令添加到「暂存区」,之后执行 commit 保存版本,那么在期间生成的一些「blob 对象」没有被引用(只有最后一次 add 生成的「blob 对象」才被引用了),这些就是垃圾对象。前面说了如果这些文件非常大,那么就会导致 .git 文件变得非常大,因此清理垃圾对象非常重要。

我们来看看下面的示例,执行三次 add 命令和一次 commit,那么就会生成 5 个对象:

在这里插入图片描述
在这里插入图片描述

通过 cat-file 命令来看看「commit 对象」到底引用了哪些对象:

在这里插入图片描述

可以看 7a(「tree 对象」)、d8(「blob 对象」)、c8(「commit 对象」)都是存在引用的,8f、37 文件里的就是垃圾对象。

Git 也提供了一些命令来让我们查看未引用的对象:

git fsck --dangling 或者 git prune -n

在这里插入图片描述

清除命令

  • git prune
  • git gc

git gc 在压缩对象的时候也会执行 git prune。

在执行 git gc 进行压缩后,可以看到 .pack 文件里实际只有三个对象,其余两个垃圾对象并没有被记录下来:

在这里插入图片描述

分支

如果我们在分支上进行 add、commit 操作,之后把这个分支删除掉,那么对于我们来说在分支上生成的这些对象都是垃圾,都是需要清除的,但是对于 Git 来说这些却不是垃圾对象,因为它会觉得我们可能会需要执行 checkout 命令把这些对象重新取出来。

比如我们新建一个 newBranch 分支,修改文件并执行 add 、commit,然后切换回 master 分支把这个分支删除掉:

在这里插入图片描述

在这里插入图片描述

可以看到我们执行 git prune -n 并没有提示有任何的垃圾对象,执行 git prune 删除也没反应。

其实通常我们是不需要删除这种对象的,除非我们非常确定这个对象该删除(存在一些秘密信息或者大量无用文件),那么我们可以执行一下命令:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0  -c gc.pruneExpire=now gc "$@"

地址

文章仓库地址:https://github.com/leopord-lau/easy-git

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

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

相关文章

网工内推 | 国企、合资公司IT专员,13薪,NA以上即可

01 上海新徐汇&#xff08;集团&#xff09;有限公司 招聘岗位&#xff1a;IT运维 职责描述&#xff1a; 1.负责制定网络体系搭建、IP地址分配、网络拓扑图、无线网络等&#xff1b; 2.负责桌面运维技术支持&#xff0c;确保各类系统和终端设备正常工作&#xff1b; 3.负责弱电…

信号量机制解决经典同步互斥问题

生产者 / 消费者问题、读者 / 写者问题和哲学家问题是操作系统的三大经典同步互斥问题。本文将介绍这三个问题的基本特点以及如何用信号量机制进行解决。 在分析这三个问题之前&#xff0c;我们首先需要了解用信号量机制解决同步互斥问题的一般规律&#xff1a; 实现同步与互斥…

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现 公司遇到的一个问题&#xff0c;目前报表有些项目是按照功能范围取值的&#xff0c;发现取多了。需要排除某些科目。 下面这例子就是要排除6601010204/05/06 这3个对应的科目 研究了很多方法…

【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪

前言&#xff1a;本文为PCB设计基础的最后一讲&#xff0c;在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了&#xff0c;接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…

巧学三极管

NPN型三极管&#xff0c;由三块半导体构成&#xff0c;其中两块N型和一块P型半导体组成&#xff0c;P型半导体在中间&#xff0c;两块N型半导体在两侧&#xff0c;三极管是电子电路中最重要的器件&#xff0c;他主要的功能是电流放大和开关的作用。 工作原理 实际上&#xff0…

QCustomPlot开源库使用

1.简介 QCustomPlot是用于绘图和数据可视化的Qt C 小部件。它没有进一步的依赖关系&#xff0c;并且有据可查。该绘图库专注于制作美观&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。看一下“ 设置”和“ 基本绘图”教…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

luceda ipkiss教程 57:画微环调制器

案例分享&#xff1a;画微环调制器 全部代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class DC(i3.PCell):straight_length i3.PositiveNumberProperty(default200)radius i3.PositiveNumberProperty(default50)spacing i3.Positive…

推荐系统算法 协同过滤算法详解(二)皮尔森相关系数

目录 前言 协同过滤算法(简称CF) 皮尔森(pearson)相关系数公式 算法介绍 算法示例1&#xff1a; 算法示例2 前言 理解吧同胞们&#xff0c;实在是没办发把wps公式复制到文章上&#xff0c;只能截图了&#xff0c;我服了&#xff01;&#xff01;&#xff01; 协同过滤算法…

基于中文垃圾短信数据集的经典文本分类算法实现

垃圾短信的泛滥给人们的日常生活带来了严重干扰&#xff0c;其中诈骗短信更是威胁到人们的信息与财产安全。因此&#xff0c;研究如何构建一种自动拦截过滤垃圾短信的机制有较强的实际应用价值。本文基于中文垃圾短信数据集&#xff0c;分别对比了朴素贝叶斯、逻辑回归、随机森…

数据结构——排序算法代码实现、包含注释易理解可运行(C语言,持续更新中~~)

一、排序 1.1 直接插入排序 1.1.1 思想 插入排序的核心操作是将待排序元素与已排序序列中的元素进行比较&#xff0c;并找到合适的位置进行插入。这个过程可以通过不断地将元素向右移动来实现。 插入排序的优势在于对于小规模或基本有序的数组&#xff0c;它的性能非常好。…

【经验分享】豆瓣小组的文章/帖子怎么删除?

#豆瓣小组的文章/帖子怎么删除&#xff1f;# 第一步&#xff1a; 手机登录豆瓣app ↓ 点右下角“我” ↓ 然后在页面点击我的小组 ↓ 点我发布的 ↓ ↓ 再任意点开一个帖子 ↓ 在文章和帖子的右上角有一个笔状的图标&#xff0c;切记不是右上角的横三点… ↓ ↓ 最后点下边的…

odoo 一日一技 owl Registry示例 在用户菜单增加开发者模式开关

# 示例介绍 在Odoo中&#xff0c;开发者模式是一个非常有用的工具&#xff0c;它允许开发人员对系统进行调试。如果每次都要去设置中打开调试模式将非常麻烦&#xff0c;上篇文章讲述了如何使用 owl registry&#xff0c;这篇我们来进行实操。 本文将介绍如何在Odoo的用户菜单…

令人感动的创富故事编号001:27岁Python程序员年入$600万+

27岁Python程序员年入$600万 27岁的你&#xff0c;在做什么&#xff1f; 为家庭生计而努力搬砖&#xff0c;辛勤工作&#xff1f; 还是放弃挣扎&#xff0c;选择躺平呢&#xff1f; 当我们还在为未来道路感到困惑之际&#xff0c;年仅27岁的Reilly已经迈向了财富自由的大门…

Socket 文件描述符

文件描述符的作用是什么&#xff1f; 每一个进程都有一个数据结构 task_struct&#xff0c;该结构体里有一个指向「文件描述符数组」的成员指针。该数组里列出这个进程打开的所有文件的文件描述符。数组的下标是文件描述符&#xff0c;是一个整数&#xff0c;而数组的内容是一…

用VR技术让党建“活起来”,打造党建知识科普新体验

随着现在工作、生活的信息化、网络化持续加深&#xff0c;传统的党建科普对年轻党员的吸引力日益降低&#xff0c;不管是面授讲课还是实地观摩的方式&#xff0c;都会受到时间和空间上的限制。因此&#xff0c;VR数字党建的出现为党建知识科普提供了新的可能&#xff0c;VR党建…

STM32 USB CDC协议的应用与优化技巧

STM32微控制器提供了使用USB CDC&#xff08;Communications Device Class&#xff09;协议来实现虚拟串口通信的功能。USB CDC协议可以将STM32设备模拟为一个虚拟串口设备&#xff0c;并通过USB接口与计算机进行通信。在本文中&#xff0c;我们将介绍USB CDC协议的应用与优化技…

elment-plus如何引入scss文件实现自定义主题色

elment-plus如何引入scss文件实现自定义主题色&#xff01;如果您想修改elementPlus的默认主题色调&#xff0c;使用自定义的色调&#xff0c;可以考虑使用官方提供的解决办法。 第一步你需要在项目内安装sass插件包。 npm i sass -D 如图&#xff0c;安装完成后&#xff0c;你…

[pytorch入门] 6. 神经网络

基本介绍 torch.nn&#xff1a; Containers&#xff1a;基本骨架Convolution Layers&#xff1a; 卷积层Pooling layers&#xff1a;池化层Non-linear Activations (weighted sum, nonlinearity)&#xff1a;非线性激活Normalization Layers&#xff1a;正则化层 Container…