如标题所述,
它们是什么意思:
引入了索引文件的实验性“版本 4”格式,以减少磁盘占用空间和 I/O 开销
更重要的是,是否存在失去与此更改的向后兼容性的风险,或者此更改是否会损坏存储库?
进行一些测试表明它是向后兼容的,并且没有发现任何不利影响。
有人可以澄清一下 msysgit 1.7.11 的这一更改实际上是什么吗?
这里不存在兼容性问题(msysgit 和 git 之间,或者与 Git 的先前版本之间),因为这与 git repo 本身的修改相同(并且官方 Git repo 没有提到任何兼容性问题)。
请参阅 git repo 中关于 GIT 索引格式的文件
Documentation/technical/index-format.txt
:
(版本4)在版本4中,条目路径名是前缀压缩的 相对于上一个条目的路径名(第一个 条目被编码,就好像前一个条目的路径名是 空字符串)。
在条目的开头,整数位于 可变宽度编码(与偏移量编码相同的编码 对于N
包条目;参见pack-format.txt)存储,其次 由以 NUL 结尾的字符串OFS_DELTA
.S
从前一个条目的路径名末尾删除字节,并将其替换为字符串N
,即可生成此条目的路径名。S
1-8 个 nul 字节(根据需要)将条目填充为 8 字节的倍数 同时保持名称以 NUL 结尾。
(版本 4)在版本 4 中,路径名后面的填充不 存在。
所以这实际上是index条目的内部管理,这不会阻止git(1.7.11或任何其他版本)克隆/读取远程存储库。
它的目的只是优化“入口路径名称”表示。
我想知道“1-8 nul 字节”是什么意思?,null 终止可以是 1 字节到 8 字节吗?
字符串的空终止符始终是单个字节 (
\0
)。 “1-8 nul 字节”特指在空终止符之后添加的用于对齐目的的填充字节,而不是指空终止符本身。在索引格式的版本 4 中,路径名后的这种特定类型的填充已被删除以优化存储。
在 Git 索引文件的上下文中,条目用空字节 (
\0
) 填充,以将它们对齐到八个字节的倍数。这种对齐对于确保数据结构针对访问和操作进行优化非常重要,从而提高许多系统的性能。规范提到“1-8 null 字节”,因为添加的 null 字节的确切数量取决于条目的长度。目标是使条目的总大小(包括其路径名和其他元数据)成为八个字节的倍数。
空终止字符串:空终止字符串是一个字符序列,后跟一个表示字符串结束的空字节 (
\0
)。这是在 C 和许多其他编程环境中表示字符串的标准方法。在这种情况下,空终止符始终是一个字节。
1-8 个空字节用于填充:在指示字符串结尾的空终止符之后,可以添加额外的空字节作为填充。 “1-8 nul bytes”短语意味着在字符串的 null 终止符之后,添加足够的 null 字节以确保条目的总大小与 8 字节边界对齐。所需的填充字节数可以从 1(如果该条目距离 8 的倍数已经有 7 个字节)到 8(如果条目大小已经是 8 的倍数,因此整个新的 8 字节块将不等)。用于填充以保持对齐)。
为什么版本4中路径名不存在填充:文档指出,在索引文件格式版本4中,路径名后面不存在填充,这是一个优化。与以前的版本不同,版本 4 通过消除路径名后不必要的填充字节来优化存储,该填充字节用于确保对齐。这一变化是减少磁盘空间使用和提高效率整体努力的一部分。