关于git与git-lfs对文件压缩存储方面的研究

news2025/1/25 5:05:31

先说结论,git使用了Delta增量压缩算法,git-lfs实测没有进行任何压缩,这个结论让我很震惊。

测试过程如下:

测试git仓库自身的压缩

准备一个包含许多杂项文件的文件夹,大概几百M,要保证有一个txt文本文件,做修改用,我们就叫这个文件夹为[数据包]。

将[数据包]压缩为TestFile.zip,我这里压缩结果大小为115M,然后放进本地仓库里。

步骤1、将TestFile.zip进行add、commit然后push到远程仓库:

步骤2、对[数据包]中的一个txt文件稍做修改,依旧是压缩为TestFile.zip,然后替换掉本地git仓库的同名文件,从而模拟修改,再次执行步骤1。

将步骤1、2这一过程循环执行3遍,这样的话,就意味着有三个115M大小的文件被push到远程仓库中,我们来验证一下远程中央仓库大小:

如上所示,远程仓库的大小确实是3*115=345M,也就是说,无论你连续几次提交之间的差异有多小,在提交并推送时,远程仓库并不会[立即]进行Delta压缩。

我们再看一下咱们的本地仓库大小:

本地仓库显示459M,实际也是合理的,因为本地仓库是[工作空间]+[仓库]:

好了,下面就是见证git的压缩技术的时候了,我们先在远程中央仓库执行压缩命令git gc:

压缩完之后,我们再看一下远程仓库的空间大小:

远程仓库的空间变成了115M,和只传了一个TestFile.zip占用的空间一样,但确实是包含了三次commit的全部历史版本数据,对每次的TestFile.zip文件的修改都能追溯。这说明了如果直接用git管理大文件,在历次对大文件的修改不大的前提下,git的Delta压缩会极大的节约空间,因为只保留历次文件修改之间的区别。

我们再对本地仓库进行下git gc看看:

结果和远程仓库一样,除了工作空间不受影响以外,仓库空间被极大的压缩,但同样在小体积的同时保留了所有对于TestFile.zip文件的历次修改。

好了,以上就是git自身对于仓库文件的压缩,下面,咱们再看git-lfs,我原本以为git-lfs作为专为管理大文件而生的git扩展,自然有对空间管理这方面的牛b之处,没想到一番测试下来大跌眼镜。

首先分别给远程中央仓库与本地仓库进行lfs的初始化:

命令:git lfs install

远程中央仓库:

本地仓库:

然后再从本地仓库执行以下命令git lfs track "*.mp4",让git-lfs负责管理.mp4格式的文件:

接下来将上面命令所生成的git-lfs配置文件.gitattributes推送到远程仓库:

上面都妥当之后,就该咱们的老朋友TestFile.zip登场了,他将继续作为测试git-lfs大文件夹存储压缩方面的关键人。

TestFile.zip:唉?不对啊,你上面不是配置了只让git-lfs管理mp4文件吗?怎么还是我?

作者:你改下后缀名不就是个mp4了嘛!

TestFile.mp4:哦~,也是哦,真有你的……

好了,那就把[数据包]中的txt文件内容稍作修改,依旧压缩为TestFile.zip,然后改后缀名为TestFile.mp4,复制到本地仓库中:

步骤1、将TestFile.mp4进行add、commit然后push到远程仓库:

步骤2、对[数据包]中的一个txt文件稍做修改,依旧是压缩为TestFile.zip,然后依旧是改后缀名为TestFile.mp4,然后替换掉本地git仓库的同名文件,从而模拟修改,再次执行步骤1。

 将步骤1、2这一过程循环执行3遍,这样的话,就意味着有三个115M大小的文件被push到远程仓库中,我们来验证一下远程中央仓库大小:

 

我们发现远程仓库的大小还是115m,那是因为远程仓库上的git仓库与存储大文件的lfs仓库路径是不同的,在部署gitea托管平台的时候会设置lfs的路径,所以我们到lfs路径下去看看:

然后我们看一下本地仓库,之前的三个TestFile.zip文件还是存放在objects文件夹下,还是占用114m,而lfs管理的mp4文件是存放到了新增加的lfs文件夹下了,三个mp4文件,3*115=345m:

好了,我们现在照猫画虎,依旧是分别在远程仓库与本地仓库执行git gc命令进行仓库压缩,看看会发生什么:

远程仓库:

本地仓库:

同样是没有任何变化:

不是,合着你git lfs是一点压缩也不干啊?哪怕三个文件就只有一个字节的区别,你也是存三份?

git lfs:是啊,那我不就省下了压缩与解压缩的时间,不就更快了嘛!

我:我特么……

结论

就跟上面的实验一样,如果你的大文件会经常性的修改,你还是别用git lfs了,哪怕你一次只做一个字节的修改,git lfs也会完整的给你存一份,压缩空间?只存增量?不存在的。你要是经常改动某些大文件,git lfs仓库所在的服务器容量分分钟给你挤爆了。当然,你要说你服务器容量管够,当我没说。

那么哪些文件适合放进git lfs,我觉得要同时满足这两点:

1、很大

2、能不修改就不会修改

如果不能同时满足这两点,劝你还是老老实实用git吧,或者用svn。

另外可能有些对git lfs有所了解的朋友会说:唉,不对啊,我记得git lfs有一个命令[git lfs prune]可以压缩空间啊。

那我只能遗憾的告诉你,这条语句不会对远程中央仓库产生半点影响,它只是暂时的将你本地用不到的lfs缓存文件给删除掉,中央服务器中依然是存储着过去的commit对于lfs缓存文件历史版本的引用。也就是说你本地删除掉的东西,随时都能从中央仓库down回来。

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

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

相关文章

openssl3.2 - 官方demo学习 - server-arg.c

文章目录 openssl3.2 - 官方demo学习 - server-arg.c概述笔记备注END openssl3.2 - 官方demo学习 - server-arg.c 概述 TLS服务器, 等客户端来连接; 如果客户端断开了, 通过释放bio来释放客户端socket, 然后继续通过bio读来aceept. 笔记 对于开源工程, 不可能有作者那么熟悉…

Kali Linux的下载安装以及基础配置

文章目录 前言一、Kali是什么?二、Kali的安装与下载Kali的下载Kali的安装 Kali的基本配置更新Kali源自定义Kali 前言 渗透测试(Penetration Testing),简称为渗透测试或漏洞评估,是一种安全评估的方法,旨在…

MySQL单表的查询练习

作业要求: 作业实现: 首先,创建worker表并插入相关数据 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varc…

js中关于字符串的创建和判断类型

文章目录 创建方法判断类型的技巧区分1、typeof2、instanceof 共点1、Object.prototype.toString.call2、库函数 参考链接:JS字符串的创建和常用方法 如何判断JS中一个变量是 string 类型 创建方法 字符串有着两种的创建方法,一个是使用构造函数&#x…

菜狗速递 快人一步

菜狗速递物流管理系统是一款针对网点管理人员开发的系统。 网点管理人员可以在该系统上进行员工信息的录入以及职能分配, 并能对客户的包裹进行一系列的处理,帮助客户查询订单信息,处理问题包裹等。 技术栈 基础框架:SpringBo…

springCloud使用apache的http类和RestTemplate以及Eureka

使用apache的: package com.csgholding.pvgpsp.eqp.util;import com.esotericsoftware.minlog.Log; import org.apache.commons.collections4.MapUtils; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apac…

腾讯云优惠券介绍、种类、领取入口及使用教程

腾讯云作为国内领先的云服务提供商,为广大的企业和开发者提供了优质的云计算、大数据、人工智能等服务。为了更好地吸引用户,腾讯云推出了多种优惠活动,其中就包括腾讯云优惠券。本文将详细介绍腾讯云的优惠券种类、领取入口以及使用教程。 一…

二分-补题

文章目录 造海船描述输入描述输出描述样例输入 1样例输出 1提示题解 寻找第一个1题目描述输入描述输出描述测试用例题解 查找数字是否出现描述输入描述输出描述样例输入 1样例输出 1题解 字典找数描述输入描述输出描述样例输入 1样例输出 1题解 寻找第一个偶数题目描述输入描述…

【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent

在MetaGPT中定义的一个agent运行示例如下: 一个agent在启动后他会观察自己能获取到的信息,加入自己的记忆中下一步进行思考,决定下一步的行动,也就是从Action1,Action2,Action3中选择执行的Action决定行动…

怎么把workspace的数据导入到simulink进行FFT分析?

怎么把数据导入到simulink在这篇博客已经阐述了,那么如何把数据导入到simulink还能进行FFT分析呢? 首先我们看simulink的FFT分析界面,(前置步骤:导入powergui模块,双击powergui模块,Tool选项卡…

第8章-第6节-Java中字符流的缓冲流

1、在说正题之前,先说一个小细节,不管是字节流还是字符流都要注意这个细节,具体看这篇博文:关于Java的IO流里面的方法read()的小细节 2、字符流的缓冲流: 1)、BufferedWriter 方法名说明void newLine()写…

代码随想录刷题题Day32

刷题的第三十二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day32 任务 ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数 1 爬楼梯(进阶&#…

JavaScript的变量详解

一、变量的声明和赋值 编程中的程序其本质就是处理数据的过程,当输入指令时,就可以输出相应的内容,在输入和输出之间就是处理数据的过程。处理的数据可能有多种,多个,这时就需要使用不同的名字来存储、区分和提取不同的…

Neo4j知识图谱(2)创建与删除

Neo4j - CQL简介_w3cschoolhttps://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html一、创建节点 create(n:Person{name:何仙鸟,age:21}) create就是创建,无论是点还是边都是用create来创建 n相当于一个别名,比如创建一个Person,而Pe…

【数据库】MySQL性能分析和优化

导语 当数据量非常庞大时,使用MySQL进行select操作可能会出现耗时特别多的情况。例如:在一张百万数据的表格good中执行select * from good;查询耗时可能需要十几秒,让客户等待十几秒,是不被接受的, 此时我们就需要对相关语句进行性能分析并优化。下面就一起看一下MySQL的…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Explicit GEMM conv)

目录 前言0. 简述1. 什么是Explicit GEMM Conv2. im2col3. spconv是如何使用Explicit GEMM Conv的4. 使用Explicit GEMM Conv处理spconv的优缺点5. 拓展-conv加速5.1 Introduction5.2 im2col5.3 Forward graph5.4 Backward graph5.5 Python example for forward propagation5.6…

研0或研一|如何快速入门深度学习?

一、经验建议 1️⃣课程篇 直接上手B站【小土堆PyTorch深度学习快速入门教程】,共计9h50min左右,预计一周就可以学完,比较偏向理论和实践相结合跟李沐学AI B站【动手学深度学习 PyTorch版】刘二大人B站【PyTorch深度学习实践】,…

Python武器库开发-武器库篇之Whois信息收集模块化(四十五)

Python武器库开发-武器库篇之Whois信息收集模块化(四十五) 我们在进行渗透的时候,需要进行全面的信息收集,除了主动信息收集之外,我们还经常会进行被动信息收集,Whois信息收集就是其中的一种,我们可以利用一些网站进行Whois信息收…

uniCloud 云数据库(1)

目录 1:云数据库入门,基本概念了解 1.1 云数据库是关系型还是Nosql? 1.2 uniCloud 云数据库和关系型数据库的对比 1.3 官方文档传送门 2: 基本操作表 创建 在uniCloud web控制台 进行创建 数据表的3个组成部分 通过传统方式操作数据库 获取集合的引用 集…

完成源示例

本主题演示如何创作和使用自己的完成源类&#xff0c;类似于 .NET 的 TaskCompletionSource。 completion_source 示例的源代码 下面的列表中的代码作为示例提供。 其目的是说明如何编写自己的版本。 例如&#xff0c;支持取消和错误传播不在此示例的范围内。 #include <w…