我的 Git 目录中的大多数文件都是纯文本文件(压缩的松散对象和包文件除外)。所以我可以 cat 和编辑文件,.git/HEAD
或者.git/refs/heads/master
检查存储库是否损坏。
但这.git/index
是一个二进制文件。纯文本文件不是更有用,因为它可以很容易地手动修改吗?
Scott Chacon 在他的演示文稿中展示了以下图片(幻灯片 278):
在我看来,这可以很容易地放入纯文本文件中。
那么为什么它是二进制文件而不是纯文本文件呢?
我的 Git 目录中的大多数文件都是纯文本文件(压缩的松散对象和包文件除外)。所以我可以 cat 和编辑文件,.git/HEAD
或者.git/refs/heads/master
检查存储库是否损坏。
但这.git/index
是一个二进制文件。纯文本文件不是更有用,因为它可以很容易地手动修改吗?
Scott Chacon 在他的演示文稿中展示了以下图片(幻灯片 278):
在我看来,这可以很容易地放入纯文本文件中。
那么为什么它是二进制文件而不是纯文本文件呢?
答案给出的任何理由都不能充分解决提出的问题,即“为什么 Git 索引文件是二进制文件?”。接受的答案是不正确的。该索引不“包含”任何纯文本文件——它包含对纯文本文件的引用。此外,说 Git 索引包含“索引条目”实际上并没有什么用处,尤其是对于寻求真相的开发人员来说……最后,树不会被索引缓存——对树的引用会被缓存。
该索引不是二进制的,因为它是“索引的”(正如海报在上面的评论中总结的那样)——而且它本身不是二进制的“性能原因”。索引中的所有内容都可以使用纯文本文件表示——甚至二进制索引文件中表示的标志和位也可以表示为 ASCII。它是二进制的,因为包含按位标志的二进制文件格式能够更有效地使用磁盘空间。而且,知道 Linus,它可能是二进制的,以便通过易于访问的文本编辑器阻止新手篡改。
* 新信息 * 索引的第 4 版实现了路径压缩,对于大型存储库,最多可以节省大约 50% 的索引大小。(来源:https ://git-scm.com/docs/git-update-index )这种压缩适合二进制格式的索引文件。
该索引,如“ git 索引到底包含什么? ”中所述,包含元数据,并且如下面的Jazimov 所述,引用:
这些数据的串联使其成为二进制文件,尽管实际原因纯属猜测。无法手动修改它可以由一个人来修改。