为什么Git索引文件是二进制的?

4
我的Git目录中大部分文件都是纯文本文件(除了压缩的松散对象和packfiles)。因此,我可以像编辑.git/HEAD.git/refs/heads/master这样的文件一样,直接查看并编辑文件,以检查存储库是否已损坏。
但是.git/index是一个二进制文件。手动修改纯文本文件不是更方便吗?
Scott Chacon在他的演示文稿中展示了以下图片(第278页):presentation Index by Scott Chacon 在我看来,这可以轻松地放到一个纯文本文件中。
那么,为什么它是二进制文件而不是纯文本文件呢?

1
https://dev59.com/Cm855IYBdhLWcg3w6IzV 中的答案可以提供帮助。 - VonC
@VonC,我只能看到有关二进制文件结构的解释。我有什么遗漏吗? - das_j
那么为什么它是二进制文件而不是纯文本文件呢?答案显示索引的结构是二进制的。 - VonC
@VonC 但它只是每个文件存储三个哈希值、修改时间和文件名。这真的需要被索引吗? - das_j
1
是的,出于性能原因。它与索引条目(https://github.com/git/git/blob/867b1c1bf68363bcfd17667d6d4b9031fa6a1300/Documentation/technical/index-format.txt#L38)和缓存树(https://github.com/git/git/blob/867b1c1bf68363bcfd17667d6d4b9031fa6a1300/Documentation/technical/index-format.txt#L132-L138)一起工作:它有助于加速从索引生成树对象以进行新提交的过程。 - VonC
@VonC 如果您将其发布为答案,我可以接受它 :-) - das_j
2个回答

6
没有任何一个答案给出的理由充分解答了提出的问题,即“为什么 Git 的索引文件是二进制的?” 被接受的答案并不正确。索引文件中并不含有任何纯文本文件——它包含对纯文本文件的引用。此外,说 Git 索引包含“索引条目”并没有提供任何有用的信息,尤其对于寻求真相的开发人员来说......最后,树并没有被索引缓存——而是对树的引用被缓存。
索引文件不是二进制文件因为它是“索引化的”(如上面的评论者所得出的结论)——也不是基于“性能原因”而使用二进制文件格式。索引文件中的所有内容都可以用纯文本文件来表示——甚至可以将二进制索引文件中表达的标志和位表示为 ASCII 字符。之所以使用二进制格式,是因为包含比特级标志的二进制文件格式可以更有效地利用磁盘空间。而且,考虑到 Linus 的个性,它可能是二进制的,以防止新手通过易于访问的文本编辑器篡改它。
* 新信息 * 索引的版本4实现了路径压缩,为大型 repo 节省了约50%的索引大小。(来源:https://git-scm.com/docs/git-update-index)这种压缩适合于二进制格式的索引文件。

1
有趣。+1。我试图修改我的答案,使它不那么不正确或荒谬。 - VonC

3

如 "Git的索引到底包含了什么?" 所述,索引中包含元数据以及,正如下文所述,由Jazimov注意到的 引用 :

  • 索引条目: 包含对条目的引用,并带有元数据(时间,模式,大小,SHA1等)
  • 缓存的树,它们是对树的引用(“从索引派生的树的预计算哈希值”),可以加快新提交的树对象生成速度。
这些数据的串联使其成为一个二进制文件,虽然实际原因纯属猜测。无法手动修改可能是其中之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接