“Git 提交是快照,而不是差异”是否会导致更大的存储需求?

问题描述 投票:0回答:1

在阅读Git Book时,作者声称提交是快照而不是差异。然后他接着说,如果文件在提交之间没有更改,则会引用以前的文件版本,而不是拍摄新快照以节省空间。

但是,我很难相信这个解释。或者至少我觉得作者没有完全解释一些事情。

例如,假设我有一个 Git 存储库,其中包含一个名为

dictionary.txt
的 4GB 文件。如果我只是在这个文本文件中添加一个新行条目,作者声称将拍摄一个新快照,因为 Git 拍摄快照而不是差异。因此,每次修改和提交此文件时,我的存储库都会增大大小,因为每次都会拍摄新快照。

我很难相信事实确实如此,并且我认为我误解了作者试图表达的观点。然而,事实上,作者强调“提交是快照,差异”,这使得它看起来像是我想理解的一个重要概念。只是让我感到困惑的是,为什么作者会评论 Git 在文件未更改时尝试节省存储空间,而忽略文件确实更改时节省存储的其他一些关键概念。

有什么帮助吗?

git
1个回答
0
投票

概念上,在简单的情况下,Git 存储完整的快照。这使其与其他仅存储相邻提交之间的差异的版本控制系统区分开来。

实际上是有优化的。

您的磁盘上有两个几乎相同的 22K 对象(每个对象都压缩到大约 7K)。如果 Git 可以完整存储其中一个对象,但第二个对象仅作为它与第一个对象之间的增量,那不是很好吗?事实证明是可以的。

主要优化是“packfiles”。 Pro Git 有专门关于它们的章节

Git 在磁盘上保存对象的初始格式称为“松散”对象格式。然而,Git 有时会将其中几个对象打包到一个称为“packfile”的二进制文件中,以节省空间并提高效率。如果周围有太多松散对象、手动运行 git gc 命令或者推送到远程服务器,Git 就会执行此操作。

packfile 是一个单一文件,包含从文件系统中删除的所有对象的内容。索引是一个包含该包文件偏移量的文件,因此您可以快速查找特定对象。很酷的是,尽管运行 gc 命令之前磁盘上的对象总共大约有 15K 大小,但新的 packfile 只有 7K。通过打包对象,您已将磁盘使用量减少了一半。

当 Git 打包对象时,它会查找名称和大小相似的文件,并仅存储从文件的一个版本到下一个版本的增量。

请注意,Git 不会存储提交之间的增量,Git 可以存储它认为最有效的任何增量。这就是为什么我说 Git 概念上存储整个文件,而存储增量是一种优化。

© www.soinside.com 2019 - 2024. All rights reserved.