git如何检测文件已被修改?

git如何快速检测文件修改?

它是否散列回购中的每个文件并比较SHA1? 这将花费很多时间,不是吗?

还是比较一个时间, ctimemtime

Git很难从lstat()值中唯一确信工作树匹配索引,因为回退文件内容非常昂贵。

Documentation / technical / racy-git.txt描述了什么样的stat字段被使用,以及如何避免一些由于mtime粒度低造成的竞争条件。 这篇文章有更多的细节 。

stat值不防篡改,参见futimens(3)。 Git可能会被愚弄到丢失对文件的更改; 这不会损害内容哈希的完整性。

有一个像“git status”这样的报告,最初的mtime检查,但是当计算出最终的提交时,m次并不重要,这是SHA1的重要性。

那么我会冒险猜测,它使用stat()调用的组合来确定看起来可能已经改变了什么,然后反过来确实使用它的不同引擎来确定是这种情况。

你可以在这里看到diff引擎的代码来得到一些想法。 我追溯了代码库,以确保状态命令确实调用了这个代码(看起来像很多东西!),实际上,当你知道Git在Windows上执行相当糟糕的时候,这一切很有意义它使用仿真层来执行这些POSIXtypes的调用:在该平台上执行git status速度要慢一个数量级。

无论如何,从上到下(如果我有时间的话,我可能会迟一些)读取所有的代码。就目前来说,我可以带你…也许有人可以更确切地说,如果他们已经与代码库工作。

注意:另一种可能的加速来自明智地使用inline函数,在头文件中可以清楚地看到这一点。

[编辑:看这里的stat()的解释]

根据平台,您应该能够找出Git使用哪些系统调用来了解其状态。 尝试在Linux上使用strace git status ,在SunOS上使用truss git status ,或者在Mac OS X上使用开发工具的看似基于DTrace的工具。