Git 的十年变化(四)|学习笔记

简介: 快速学习 Git 的十年变化(四)。

开发者学堂课程【Git从入门到进阶Git的十年变化(四)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1194/detail/18118


Git的十年变化(四)


内容介绍:

一、 小明撰书记案例介绍

二、 GC触发机制

三、 小球分配实验


第四期视频:感谢大家对前几期视频的关注与支持,通过前面的几期视频,想必大家对 get 已经有了比较多的了解。

本期视频将通过对 Git 仓库文件的一个揭秘,帮助大家进一步了解的并优化的一个存储。空间占用, 相较于另一款大众化的软件版本控制系统SVN常被称之为基于快照的版本控制系统。这是为什么呢?将通过一个故事来为大家讲解:

 

一、小明撰书记案例介绍

每一个故事都需要一个主角,故事的主角是小明同学。小明同学决定出一本书,它把书写好以后给到出版社,出版社需要对所有的创造了一个原稿做副本,通过复印机复印了每一页的一个内容,也就是复印好并保存下来的是完整的数据内容,并且给它们指定的唯一的一个编号,以便于更好地查找。

Git 也实施这种类似的一个方式,将文件数据压缩后完整的保留下来。而这些以哈希命名的文件就是经常提到的一个较松散对象。到这里可能有人会说似乎看不出与SVN有什么明显的差别,让我们再进一步继续看:

image.png

为了方便管理,还未定稿的稿件都统一的收入到一些抽屉里,这些抽屉使用稿件编号的手两位来命名。

这样做的一个好处是当我们在已知稿件编号的情况下可以更快的去查找到想要的一个稿件。

image.png

对于第一次提交了200页的稿件,被投递到编号为fd的一个抽屉里面。小明又觉得200页的稿件有点短,于是乎又加了50页。250页的一个稿件,同样也进行了一个全量的一个备份,写上编号,投放到编号为2d的一个抽屉里。

但是新增的50页又与前面的小部分内容有点不搭。于是小明又删除了前面20页,再次产出了总共为230页的稿件。同样这些稿件的副本也被投放到编号为6d抽屉里。

对应到给当中可以看到在松散对象当中,其实每一个对象都存储了完整的一个内容,如图所示:

image.png

可以看到在创建了第一个64K的一个对象之后,仅做了少量的修改,后续生成的对象都比第一个对象更大一些,因为增加了少量的一个内容,而不是仅存储少量的一个增量内容。问题来了每次都保留完整的一个副本,在管理上的确是非常方便,因为每一个文件都是独立的个体,并不用考虑它们之间的一个联系。但是这样做也意味着存储压力就更大了,这些抽屉很快就会被全部塞满。

image.png

于是,每隔一段时间,出版社就会对所有抽屉的书进行一个归档核定,把它们都整合在一起。举例来讲对于第一次的200页的书,由于是全新的内容,保留了全部内容,而后面的第二版的250页则用了另外一张纸,写上了前面200页书的一个页码及页数信息,而后附上了50页新增的内容。

也就是在第二版本使用了51页的内容,就替换了原有250页的一个完整内容。然后第三版则记录了第二版的一个页码及页数信息,并附上了删除的一个内容,信息就变成了第三版内容的一个存储。正是通过这样的一个方式,仅使用少量的一个纸张,就完成了对三本完整书籍内容的一个压缩。虽然这样改变了原有的一个存储方式,不再存储每本书的完整内容,但是可以发现,它仍然是使用原有的完整的内容的一个编号进行索引的,在查找的时候将它还原成原来的一个完整内容。

为了便于内容查找在打包了书籍外,还附上了一个特殊的一个目录,称之为引用。

在这里记录了每一本书的编号以及对应的一个页码位置信息,方便进行查找。

image.png

对应 Git 当中,通过执行ADC,可以将之前的非常多的一个松散对象进行打包,它会变成一个体积更小的一个打包文件。然后可以看到打包后的一个对象,它整体大小只占用了80K,远小于之前的那些松散对象存储。此外它还产生了一个后缀为.IDX的一个索引文件。

 

二、 GC触发机制

既然提到了Git 的垃圾回收机制给了GC,它是如何触发的呢?它主要有两种触发方式,主动执行和自动执行。主动执行可以通过执行命令行 git gc 来完成,自动执行则需要满足一定的一个触发条件,比如松散对象的一个数量达到gc.auto设置的一个标准,默认是6700个。如何判断对象达到6700个呢?这里我们通过一个小实验来说明。

 

三、小球分配实验

接下来,将为大家演示一个小球分配的一个实验。现在有了非常多的小球。以及编号从00~ff的256个盒子。

image.png

这些小球,会随机地投放到这256个盒子当中。如何判断此时小盒子中的小球数量已经近似达到6700个呢?由于小球随机投放到这些盒子当中,并且6700个样本数量本身比较多,可以认为投放是相对均匀的,也就是投放小球足够多之后,每一个和自己的小球数量非常相近,因此就可以选择其中的一个盒子来近似的判断,当盒子中和小球数量多于26个,为什么是26个呢?就是6700个除以256个认为满足的一个条件。那在Git当中,通过判断objects17这一题目录下的一个文件数。认为超过26个即满足。有人会问,为什么会选择17这一题目录呢?

那也许是为了纪念的它的作者 Linux,因为 Linux 是2000年第17位,入选时代杂志中百大最具影响力人物的。

通过本期视频了解到,Git 中索引的是完整的文件内容,而不是增量的差异。通过执行 git gc 或者自动gc可以完成对松散对象文件的打包,减少负担占用。Git 中通过判断 objects17目下是否多于26个文件来近似判断整体松散对象的数量是否达到6700个,该方法也可以应用到类似的均匀分布的数据估计当中。

image.png

在执行 GIT 17之后,经常会留存一些生产对象,无法删除这些对象,称为草稿,又称之为不可达对象。不可达对象默认保留14天,可以通过 cc.auto 进行修改。

除此之外,我们还可以通过一些参数来改变计息词尾,比如--prune 来指定清理的一个时间,--now可以直接清理所有的一个不可达对象,又或者放不对任何对象做一个清理动作。

在执行机器之后,会发现一个非常有趣的一个现象,生成的打包文件,有时候会小于原有的单个生产对象。这是由于生产对象使用的zip压缩级别是一。速度优先对文件内容几乎没有压缩,打包文件使用的压缩级别为复印,是默认的压缩级别,请求速度和加速进行一个默认的折中,相当于六级。可以通过如下这些设置进行修改。

也可以通过设置 repack . rightbitmaps = 1。来开启我们的 bitmap(位图),在 gc 时创建位图, 将有效提升大仓库的一个访问效率。

相关文章
|
3月前
|
Shell 网络安全 开发工具
Git学习笔记
Git学习笔记
79 1
Git学习笔记
|
7月前
|
Linux 网络安全 开发工具
Git学习笔记
Git学习笔记
57 0
|
8月前
|
Linux 网络安全 API
git常用命令学习笔记
git常用命令学习笔记
45 0
|
9月前
|
程序员 开发工具 git
搭建博客可能会用到的 Git 命令|学习笔记
搭建博客可能会用到的 Git 命令|学习笔记
|
10月前
|
算法 安全 Linux
git第n次学习笔记
git第n次学习笔记
71 0
|
12月前
|
项目管理 开发工具 git
Git学习笔记(三) git submodule
Git学习笔记(三) git submodule
125 0
|
12月前
|
缓存 开发工具 git
Git学习笔记(二) git stash
Git学习笔记(二) git stash
858 0
|
12月前
|
开发工具 git
Git学习笔记(一) 常用命令
Git学习笔记(一) 常用命令
104 0
|
12月前
|
缓存 Linux 程序员
【学习笔记之Linux】工具之make/Makefile与git
【学习笔记之Linux】工具之make/Makefile与git
172 0
|
开发工具 git 索引
Git学习笔记-详细使用教程
Git学习笔记-详细使用教程
Git学习笔记-详细使用教程

相关实验场景

更多