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

先说结论,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.mzph.cn/news/622650.shtml

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

相关文章

require vs import,深入了解JavaScript模块引入方式,应用场景剖析

JavaScript作为一种脚本语言,经过多年的发展已经成为Web开发的主要语言之一。随着项目的复杂性增加,对于代码组织和管理的需求也日益迫切。这促使了JavaScript模块系统的不断发展。 背景 JavaScript模块系统的发展背景 在早期,JavaScript并…

Qt框架学习 --- CTK编译(Qt5.15.2+vs2019+cmake)

系列文章目录 第二章 CTK的测试demo https://blog.csdn.net/yonug1107716573/article/details/135527289 文章目录 系列文章目录前言一、准备工作二、编译步骤1.修改文件2.编译CTK2.1 准备2.2 cmake界面配置2.3 配置编译器2.4 编译的配置设置2.5 选择需要编译的模块2.6 生成2.…

Python和Julia TensorFlow科学计算常微分方程求解器

常微分方程 常微分方程(ODE)可用于描述动态系统。 从某种程度上来说,我们生活在一个动态系统中,窗外的天气从黎明到黄昏都在变化,我们体内发生的新陈代谢也是一个动态系统,因为随着时间的推移,…

Jenkins容器使用宿主机Docker

构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。 设置Jenkins容器使用宿主机Docker 设置宿主机docker.sock权限: sudo chown root:root /var/run/docker.sock sudo chmod orw /var/run/d…

Easypoi word 模板导出问题

按word模板导出报错 源代码: //获取项目的根目录 ClassPathResource classPathResource new ClassPathResource("/word/template.docx"); InputStream inputStream classPathResource.getStream(); MyXWPFDocument xwpfDocument WordExportUtil.expo…

Uibot (RPA设计软件)股票板块行情抓取————课前材料四

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~) 紧接着小北的前两篇博客,友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

Java 并发性和多线程3

七、线程安全及不可变性 当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改&…

AI绘画风格化实战

在社交软件和短视频平台上,我们时常能看到各种特色鲜明的视觉效果,比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格,每一种都带有鲜…

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

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

嵌入式软件面试之程序在存储器中的分布

Hi, 大家好,今天阿目分享的是一个嵌入式软件面试的常见问题,内存分布或者说程序在内存中的布局,我们写的程序是按照怎么的准则放在内存中的? 一般有操作系统的嵌入式设备,都会有一个Bootloader, 它负责在上电后初始化…

reids优化系列(五)

后面更新的这些文章是将所学的redis知识进行巩固并且分享,也希望这些知识不仅仅是用于复习面试,更能在实际的应用中起到优化的作用。 有时候我们会存储一些查询多,修改少,业务逻辑较弱的数据,并且还能高效查询&#x…

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞(CVE-2023-44487)、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本:9.4.53以下版本 处理方式:原地升级 ( jdk版本…

【记录】求职经历

目标岗位:嵌入式开发 1. 线上笔试 常用算法,比如动态规划、递归等标准模板库(STL)C 11新特性LeetCode刷题牛客刷题 2. 技术一面 3. 技术二面 4. 主管面 5. HR面

学习redis有效期和数据类型

1、安装redis和连接redis 参考:ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis:redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…

BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身)

BCPL(“基本组合编程语言”)是一种过程式、命令式和结构化的编程语言。BCPL最初旨在为其他语言编写编译器,现在已不再常用。然而,它的影响仍然存在,因为BCPL的一个剥离和语法改变的版本,称为B,是C编程语言的基础。BCPL…

Linux文件创建教程:简单易懂的操作指南和示例代码详解

在Linux系统中,文件的创建是日常使用中经常遇到的操作之一。本篇教程将向你介绍如何在Linux系统中创建文件,并提供详细的示例代码,让你能够轻松上手。 1. 使用touch命令创建文件 touch命令是最简单、最常用的创建文件的方法之一。它可以用来…

jenkins-cl参数化构建

pipeline片段(对应jenkins-cli -p参数的BRANCHdevelop) parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求:假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?  分析:这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

单片机学习记录(四)

第8章 1.在异步串行通信中,接收方是如何知道发送方开始发送数据的? 答:当接收方检测到RXD引脚上有负跳变时,即可知道发送方开始发送数据; 2.AT89S51单片机的串行口有几种工作方式?有几种帧格式&#xff…

世邦通信 SPON IP网络对讲广播系统addscenedata.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上传恶意后门文件&#xff…