首页 > 解决方案 > blob 是否包含文件的当前状态或仅包含最后一次更改?

问题描述

假设您有新的 git 存储库并添加一个文件 README.MD 并写入

foo

到该文件并首次提交该文件。据我了解,git 在提交时会创建三个新对象:blob、树和提交。提交对象引用树,而树又引用树或 blob。

假设您进行了第二次提交,将 bar 添加到 README.MD,因此文件如下所示:

foo
bar

并提交此文件,为该提交创建一个新的 blob。那个新的blob是否成立

foo
bar

或仅最后一次更改:

bar

?

标签: git

解决方案


正确答案是 (c):最近的 blob 包含它们所代表的文件的完整(压缩)内容,但文件的旧版本可以移动到packfiles 中

当 Git 打包对象时,它会查找名称和大小相似的文件,并仅存储从一个文件版本到下一个文件版本的增量。你可以查看包文件,看看 Git 做了什么来节省空间。git verify-pack 管道命令允许您查看打包的内容:

稍后,解释一个详细的例子:

在这里,033b4 blob,如果您记得是 repo.rb 文件的第一个版本,它正在引用 b042a blob,这是该文件的第二个版本。输出中的第三列是包中对象的大小,所以可以看到 b042a 占用了文件的 22K,而 033b4 只占用了 9 个字节。同样有趣的是,文件的第二个版本是完整存储的,而原始版本是作为增量存储的 ——这是因为您很可能需要更快地访问文件的最新版本.

如果 git 总是单独存储每个文件的每个版本,那么它就无法处理很长的历史。它永远不会成功。

git cat-file以及对文件内容进行操作的所有其他 git 命令透明地提取打包文件,因此您甚至不必知道这种情况正在发生。

另请参阅git 如何存储文件?


推荐阅读