我在official git website上读到:
Git和任何其他VCS(包括Subversion和朋友)之间的主要区别在于Git对其数据的看法。从概念上讲,大多数其他系统将信息存储为基于文件的更改列表。这些系统(CVS,Subversion,Perforce,Bazaar等)将它们保存的信息视为一组文件以及随着时间的推移对每个文件所做的更改,(...)
Git没有想到或以这种方式存储数据。相反,Git认为其数据更像是一组迷你文件系统的快照。每次你在Git中提交或保存项目状态时,它基本上都会记录当时所有文件的外观,并存储对该快照的引用。 (...)
所以我想知道:如果保存了快照而不是更改,是否意味着如果我更改了10Ko文件中的一个字符,那么将在我的存储库中创建第二个10Ko文件(或blob)?
什么是引擎盖下的斑点?文件本身?它被压缩了吗?我的文件中的任何小变化都会大大增加存储库吗?
据我所知,我们会在他们来之前回复你的意见:我知道磁盘空间不再是问题而且我不必担心复制10Ko,我的问题只是为了满足我的好奇心
好的,Git's blob data and diff information提供了一半的信息。但它是否以任何方式进行压缩和/或空间优化?
答案 0 :(得分:2)
(快速和noobish回答)
当您的回购packing时,它会被压缩。据我所知,他有时会反转差异,以便存储的纯文本版本是最新版本。差异与旧的差异。这样可以更快地访问最新的更改。
答案 1 :(得分:1)
所以我想知道:如果保存了快照而不是更改,是否意味着如果我更改了10Ko文件中的一个字符,那么将在我的存储库中创建第二个10Ko文件(或blob)?
简短回答:是的。详细信息:config options core.compression
和core.loosecompression
为松散和打包的对象提供压缩参数。默认情况下,松散对象使用最小压缩设置。所有对象都存储为type[sp]length[nul]data
输出,与zlib本身附带的zpipe
示例完全等效,通常,git非常简单。在内部,打包完全是git的对象访问层内部的。
获取zlib,构建zpipe,并在松散的对象上运行它可能非常有用。听到对象只是具有例如数据的数据是一回事。 “blob 123 \ 0”卡在前面,一个123字节的blob或“commit 1323 \ 0”卡在提交文本的前面,另一个看到它真的那么简单。即使是包装格式也不多,它只是通过纯粹的随机机会才真正发挥作用。
Git打包并压缩松散的物体,只要它的试探说有足够的物体躺在周围以使delta压缩收益令人满意。你也可以对它们进行调整,但所有这些都或多或少地按目标进行,回顾我手动重新包装的时间,我不能说它值得打扰。