我想知道git (至少在理论上)是否允许一个给定的文件由多个blob组成。
这在以下情况下会很有用:
commit-1: composed of big file F.
commit-2: edit on F, one line in its contents was edited.如果发生这种情况,git可以将F的原始blob分解为3个blob,将commit-1指向这三个blob(让我们称它们为A、B和C),现在将commit-2指向blob A、B‘和C。这在某些病理情况下可能会在内存/磁盘空间中节省千兆。
根据我对git树和blobs的理解,git不是这样设计的。我是不是遗漏了什么?
谢谢
发布于 2018-12-22 23:43:08
你不是。git并不是为处理大文件而设计的,它的存储机制显示了这一点。遗憾的是,即使是Git LFS在这里也帮不上忙。
最初,你的新文件将被写成一个松散对象--这是一个zlib压缩的完整blob,即使它只是现有blob的1个字节的改变。
最终,此文件将存储在一个包文件中,其中它可能与相邻的blobs一起被增量压缩,但不能保证。
您可以在libgit2中构建自定义存储后端,添加您自己的机制,该机制对于您自己的已知数据格式是有效的。但是你不会与命令行git有任何兼容性,所以对于大多数应用来说,这将是一个不幸的情况。
发布于 2018-12-22 22:46:19
Git使用增量压缩来有效地打包blobs。https://en.wikipedia.org/wiki/Delta_encoding#Git
https://stackoverflow.com/questions/53896573
复制相似问题