4

我的 Git 目录中的大多数文件都是纯文本文件(压缩的松散对象和包文件除外)。所以我可以 cat 和编辑文件,.git/HEAD或者.git/refs/heads/master检查存储库是否损坏。

但这.git/index是一个二进制文件。纯文本文件不是更有用,因为它可以很容易地手动修改吗?

Scott Chacon 在他的演示文稿中展示了以下图片(幻灯片 278): Scott Chacon 的索引

在我看来,这可以很容易地放入纯文本文件中。

那么为什么它是二进制文件而不是纯文本文件呢?

4

2 回答 2

6

答案给出的任何理由都不能充分解决提出的问题,即“为什么 Git 索引文件是二进制文件?”。接受的答案是不正确的。该索引不“包含”任何纯文本文件——它包含对纯文本文件的引用。此外,说 Git 索引包含“索引条目”实际上并没有什么用处,尤其是对于寻求真相的开发人员来说……最后,树不会被索引缓存——对树的引用会被缓存。

该索引不是二进制的,因为它是“索引的”(正如海报在上面的评论中总结的那样)——而且它本身不是二进制的“性能原因”。索引中的所有内容都可以使用纯文本文件表示——甚至二进制索引文件中表示的标志和位也可以表示为 ASCII。它是二进制的,因为包含按位标志的二进制文件格式能够更有效地使用磁盘空间。而且,知道 Linus,它可能是二进制的,以便通过易于访问的文本编辑器阻止新手篡改。

* 新信息 * 索引的第 4 版实现了路径压缩,对于大型存储库,最多可以节省大约 50% 的索引大小。(来源:https ://git-scm.com/docs/git-update-index )这种压缩适合二进制格式的索引文件。

于 2017-04-28T04:59:25.220 回答
3

该索引,如“ git 索引到底包含什么? ”中所述,包含元数据,并且如下面Jazimov 所述引用

  • 索引条目:对条目的引用,带有元数据(时间、模式、大小、SHA1,...)
  • 缓存树,引用树(“可以从索引派生的树的预计算哈希”),这有助于加快从索引生成树对象以进行新提交。

这些数据的串联使其成为二进制文件,尽管实际原因纯属猜测。无法手动修改它可以由一个人来修改。

于 2014-12-02T10:23:24.983 回答