首页 > 解决方案 > git 是如何快速检测目录变化的?

问题描述

我在这里阅读了许多文章和答案,但它们没有帮助。

我知道 git 使用mtime并且ctime确实检测到该文件在没有阅读的情况下被更改,这是有道理的,但是:

我尝试查看 diff-index 的来源,但它们似乎相当复杂。

请注意,它不是git 如何检测文件已被修改?. 我知道 git 使用mtimectime. 我想知道 git 怎么能这么快得到它们。或者可能是 git 每次运行时都不计算它们git diff?这就是这个问题的重点。

标签: git

解决方案


长答案短:

strace -fostrace.log git diff-index --quiet @
vi strace.log

至少当有很多事情要做时,它会触发一个并行发布统计信息的大批量线程,因此文件系统有很多待处理的请求,并有机会优先考虑吞吐量。

还:

git 还是要遍历整个目录树

不,它没有。tttt,这就是索引被称为“缓存”的原因。它关心的所有名称(和最后一次查看的数据)都在一个大的读取前读取,.git/index对于完整的 linux 结帐是 5MB,这就像两次搜索,即使是第一次也只有几毫秒在硬盘上,这意味着要寻找它并将其摆动的部分从盘子上吸走。


推荐阅读