24

我对 Git 中暂存目录(Git 索引)的命名感到困惑。

有什么特别的意思叫索引吗?为什么不直接调用Cache/或Temp目录让我们更容易理解呢?

对我来说,索引是帮助我们更快地搜索事物的东西,比如在 DBMS 中建立索引,它与暂存区有什么关系???

我做了一些谷歌搜索,但仍然没有太多想法。参考链接Git 索引

4

1 回答 1

27

Git 的主要维护者 Junio C. Hamano的文章对于掌握缓存和索引之间的区别具有指导意义:(
强调我的)

当 Linus 开始编写 git 时,他的目标是让他能够重现由他在 BitKeeper 时代之前使用的原始“tarball 和补丁”工作流程产生的每一个中间状态。
从 2.6.12 tarball 开始,他将 patch-1、patch-2... 排入队列,因此 2.6.12 本身、应用了 patch-1 的 2.6.12、同时应用了 patch-1 和 patch-2 的 2.6.12,变成三个版本。

但是,如果您必须每天洗牌数百个补丁,这显然不会扩展。于是他发明了“目录缓存”;作为一个概念,这大致对应于当今 git 中的“树”对象:记录的集合,每个记录都是整个目录结构包含的内容的紧凑表示。
构建它的方法是“将内容添加到缓存中,或更新缓存中的内容”。

托管此类版本控制记录集合的控制目录被命名为“ .dircache”(.git一段时间后重命名为“”)。
有一个名为“ .dircache/index”的文件,该文件的内容在 C 语言中的一组变量中读取和操作,这些变量以名词“”命名cache
那时,我们今天称之为索引的概念,即一个缓冲区,用于构建您打算作为树对象写出的内容集合,被称为“缓存”
每个人都交替谈论“缓存”和“索引”,因为记录“ ”中内容的文件cache被命名为“ index”。

随着越来越多的人开始使用 git 而无需阅读其代码,出于显而易见的原因,“索引”一词的使用变得越来越普遍。
作为文件系统上的东西,它比 C 源代码中的变量名更明显。
最终,在解释使用 git 作为最终用户时,我们不再使用“缓存”作为名词来命名我们今天所说的“索引”。
然而,当我们想在讨论 git 实现的上下文中讨论内部数据结构时,“缓存”这个词仍然用作名词(例如,“让我们让程序可以同时使用多个缓存” )。

在最终用户级别,“缓存”现在仅用作形容词;“缓存”,意思是“缓存在索引中的内容,而不是工作树中的内容”。
我们可以称它为“索引”,但“缓存的内容”在很早的时候就已经是一个已经确立的短语,用来表示这个确切的概念,我们不需要另一个词来表示同样的事情。

[...] 在早期,“将新文件添加到索引”和“使用新内容更新索引中已经存在的文件”之间存在区别。
[...] 现代(和中世纪)版本的 gitgit add对两者都使用“”。我们本可以老实说,将更新或添加到索引的行为称为“ add”,但是“git 培训”行业的一些人开始将索引作为“下一次提交的暂存区”进行教学,并且作为一个不可避免的结果,动词“to stage”开始出现在许多文档中,意为“将内容添加到索引中的行为”。
我自己有时也会使用这个动词,但那只是在我怀疑观众可能首先从这些新人那里学到了 git 的时候。

于 2011-07-16T14:53:01.527 回答