【发布时间】:2015-03-29 03:36:33
【问题描述】:
阅读 git 的文档,他们非常强调的一件事是 git 存储的是快照而不是增量。因为我看到一个关于 Git 的课程说 Git 存储文件版本之间的差异,所以我尝试了以下操作:我在一个空文件夹上初始化了一个 git 存储库,创建了一个包含一些 lorem ipsum 文本的文件 lorem.txt 暂存文件并提交。
然后在命令行上使用find .git/objects -type f,我列出了 git 保存在对象文件夹中的内容,并按预期找到了一个提交对象,该对象指向一个树对象,该对象指向一个包含我保存的 lorem ispum 文本的 blob 对象。
然后我修改了 lorem ipsum 文本,向其中添加了更多内容,进行了此更改并提交了。再次列出文件,我现在可以看到新的提交对象,指向一个新的三个对象和一个新的 blob 对象。使用 git cat-file -p 331cf0780688c73be429fa602f9dd99f18b36793 我可以看到新 blob 的内容。它们正是完整的 lorem.txt 文件的内容,旧内容加上更改。
这符合文档的预期:git 存储快照,而不是增量。但是,在互联网上搜索我找到了this SO question。在接受的答案中,我们看到以下内容:
虽然这在概念级别上是正确且重要的,但在存储级别上并非如此。
Git 确实使用增量存储。
不仅如此,它比任何其他系统都更有效。因为它不保留每个文件的历史记录,所以当它想要进行增量压缩时,它会获取每个 blob,选择一些可能相似的 blob(使用包含先前版本和其他一些最接近近似的启发式算法),尝试生成增量并选择最小的增量。通过这种方式,它可以(通常取决于启发式)利用其他类似文件或比以前更相似的旧版本。 “pack window”参数允许用 delta 压缩质量的交易性能。默认值 (10) 通常会提供不错的结果,但是当空间有限或为了加快网络传输速度时, git gc --aggressive 使用值 250,这使其运行速度非常慢,但会为历史数据提供额外的压缩。
这说明 Git 确实使用 deltas 进行存储。据我了解,Git 并非一直使用增量,而是仅在检测到有必要时才使用。这是真的吗?
我在文件上放置了很多 lorem 文本,所以它的大小为 2mb。我认为当对大文本文件进行小改动时,Git 会自动使用增量,但正如我所说的那样。
Git 什么时候使用 deltas 以及它是如何工作的?
【问题讨论】:
-
见
git gc或git repack -
Git 在创建包文件时使用增量压缩来有效地存储对象。这是关于所使用的压缩算法的实现细节——它对于 使用 git 完全无关紧要。
-
它的对象存储层执行增量压缩,当它的启发式表明重型压缩的回报将是令人满意的,或者当你明确告诉它时。
标签: git