git如何这么快地检测到文件修改?
是否会对存储库中的每个文件进行哈希处理并比较SHA1?这会花费很多时间,不是吗?
或者它比较atime,ctime还是mtime?
Answers:
Git试图仅从lstat()值中就使工作树与索引匹配,因为回退文件内容非常昂贵。
Documentation / technical / racy-git.txt描述了使用哪些stat字段,以及如何避免由于低mtime粒度而导致的某些竞争条件。本文有更多详细信息。
统计值不是防篡改的,请参阅futimens(3)。Git可能会愚弄丢失文件的更改;这不会损害内容哈希的完整性。
最初有mtime检查报告,例如“ git status”,但是当计算最终提交时,mtime无关紧要……SHA1很重要。
git status您会在我所做的粘贴中看到修改。
lstat它们起作用。
好吧,我很可能会猜到它正在使用多个stat()调用组合来确定可能已发生的变化,然后实际上是试图确定是否使用了差异化引擎。
您可以在此处查看diff引擎的代码以了解一些想法。我在代码库中进行了跟踪,以确保status命令确实调用了此代码(看起来很多东西!),实际上,当您知道Git在Windows上的性能很差时,所有这些都非常有意义。它使用仿真层来执行这些POSIX类型调用:git status在该平台上执行操作要慢一个数量级。
无论如何,只要从头到尾阅读所有代码(如果有时间我可能会稍后再说!),这就是我目前可以接受的范围……如果有人使用过该代码库,也许可以更加确定。
注意:另外一种可能的加速来自明智地使用inline函数,在明显有意义的地方,您可以在标题中清楚地看到这一点。
[编辑:看到这里的的解释stat()]
stat()/是什么?