msysgit 1.7.11 的变更日志中说:索引文件的实验性“版本 4”格式是什么意思

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

如标题所述,

它们是什么意思:

引入了索引文件的实验性“版本 4”格式,以减少磁盘占用空间和 I/O 开销

更重要的是,是否存在失去与此更改的向后兼容性的风险,或者此更改是否会损坏存储库?

进行一些测试表明它是向后兼容的,并且没有发现任何不利影响。

有人可以澄清一下 msysgit 1.7.11 的这一更改实际上是什么吗?

git msysgit
1个回答
2
投票

这里不存在兼容性问题(msysgit 和 git 之间,或者与 Git 的先前版本之间),因为这与 git repo 本身的修改相同(并且官方 Git repo 没有提到任何兼容性问题)。

请参阅 git repo 中关于 GIT 索引格式的文件

Documentation/technical/index-format.txt

(版本4)在版本4中,条目路径名是前缀压缩的 相对于上一个条目的路径名(第一个 条目被编码,就好像前一个条目的路径名是 空字符串)。
在条目的开头,整数

N
位于 可变宽度编码(与偏移量编码相同的编码 对于
OFS_DELTA
包条目;参见pack-format.txt)存储,其次 由以 NUL 结尾的字符串
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 通过消除路径名后不必要的填充字节来优化存储,该填充字节用于确保对齐。这一变化是减少磁盘空间使用和提高效率整体努力的一部分。

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