git如何检测文件已被修改?
git如何快速检测文件修改?
它是否散列回购中的每个文件并比较SHA1? 这将花费很多时间,不是吗?
还是比较一个时间, ctime
或mtime
?
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的工具。