我已经使用git一段时间,但是当我在像LibreOffice这样的非常大的项目中使用git时,我观察到了这一点。每当我第一次查询git时,它需要的时间比遵循相同命令的查询要多得多:
@Html.TextBoxFor(model => model.FileData, new { type = "file" })
我的问题是:git是否在其内部实现中使用了某种缓存?如果是,那么.git / *目录中的那些缓存结果会被存储?或者它与git无关,还是依赖于我正在使用的平台。
答案 0 :(得分:2)
是和否。
您展示的片段暗示您在某些Unix-y平台上,如某些基于GNU / Linux或* BSD的操作系统或Mac OS。这些平台通常具有良好的文件系统缓存功能,因此下次Git扫描您的工作树时,许多/大部分信息都是从主内存而不是磁盘提供的。
另一方面,在Windows上,Git想要执行的文件系统操作很慢,它的ptalform端口Git for Windows有一个由core.fscache
configuration knob控制的特殊功能。此功能实际上为工作树中的文件实现了所谓的“stat”信息的实际内存缓存。
此缓存是-AFAIK-in-memory,因此它不会存储在任何地方。
另外需要注意的是,所谓的“索引” - 您为下一次提交暂存更改的特殊位置,以及git commit
创建的下一次提交被切断的特殊位置实际上是一个特殊的缓存,在Git的早期,它被称为那种方式。一些Git命令仍然支持--cached
命令行选项,这使得他们只考虑引用git help cli
手册的索引:
关于常见的混淆选项的说明
许多可以处理工作树和/或文件中的文件的命令 在索引中可以选择
--cached
和/或--index
。 有时人们错误地认为,因为索引是 最初称为缓存,这两个是同义词。 它们不是 - 这两个选项意味着非常不同的东西。
--cached
选项用于通常询问命令 适用于工作树中的文件,仅适用于索引。 例如,git grep
,在没有提交指定的情况下使用 从中查找字符串的提交,通常适用于文件 在工作树中,但使用--cached
选项, 它在索引中查找字符串。
--index
选项用于通常询问命令 适用于工作树中的文件也会影响索引。 例如,git stash apply通常会合并记录的更改 在工作树的藏匿处,但使用--index
选项, 它也会将更改合并到索引中。
git apply
命令可与--cached
和--index
一起使用 (但不是在同一时间)。通常命令只影响 工作树中的文件,但--index
, 它会修补文件及其索引条目, 使用--cached
,它只修改索引条目。
这种情况下,暂存区域实际上是“缓存”源于此
Git最初被设想为所谓的实现
“内容可寻址的文件系统”刚刚设法迅速超越
这个想法成为围绕这个核心理念构建的成熟VCS。
缓存将保存即将记录为下一个文件系统的条目
用于快速访问的快照(提交)。即使在今天也是如此:指数
保持git status
的暂存文件的“统计”信息有效
快速跳过实际计算文件上的哈希值似乎没有
与索引中的内容相比,在工作树中进行了更改。
请参阅Git SCM wiki上的"Git History"页面,并在此处查找“缓存”一词: 它很好地解释了该指数的历史背景。
最重要的是,这里有多个不同的缓存:操作系统的文件系统缓存,Git自己的缓存以及启用时特定于Windows的缓存。
只有索引实际上是“存储”的:没有特殊配置调整的股票Git thiis是位于“.git”子目录下的名为“index”的文件。