git - git 是如何快速检测目录变化的?
问题描述
我在这里阅读了许多文章和答案,但它们没有帮助。
我知道 git 使用mtime
并且ctime
确实检测到该文件在没有阅读的情况下被更改,这是有道理的,但是:
- 在我的 repo 中的每个文件上运行 lstat 需要 79 秒,但 git 在不到一秒的时间内完成
- 它如何在不扫描整个目录树的情况下检测添加或删除的文件?
我尝试查看 diff-index 的来源,但它们似乎相当复杂。
请注意,它不是git 如何检测文件已被修改?. 我知道 git 使用mtime
和ctime
. 我想知道 git 怎么能这么快得到它们。或者可能是 git 每次运行时都不计算它们git diff
?这就是这个问题的重点。
解决方案
长答案短:
strace -fostrace.log git diff-index --quiet @
vi strace.log
至少当有很多事情要做时,它会触发一个并行发布统计信息的大批量线程,因此文件系统有很多待处理的请求,并有机会优先考虑吞吐量。
还:
git 还是要遍历整个目录树
不,它没有。tttt,这就是索引被称为“缓存”的原因。它关心的所有名称(和最后一次查看的数据)都在一个大的读取前读取,.git/index
对于完整的 linux 结帐是 5MB,这就像两次搜索,即使是第一次也只有几毫秒在硬盘上,这意味着要寻找它并将其摆动的部分从盘子上吸走。
推荐阅读
- angular - 地图
FireStore 错误 - java - Android 加密/解密
- javascript - 本地存储不识别阵列名称
- sql - 计算两个段之间的天数
- android - 我是否需要 Firebase 才能在我的 Android 应用中使用 Google 登录?
- javascript - 获取所有值的总和,但为什么它在所有动态项目中显示相同的总数
- image - Alchemy CMS - Cloudinary - 站点 - 为每个站点使用 diff 文件夹 - 未过滤站点的图像
- c# - 共享会话状态不起作用;两个 ASP.NET_SessionId cookie?
- gitkraken - 我只能在树视图中查看本地或远程分支吗?
- django - Django Web 应用程序的 Heroku 错误请求服务器错误 500