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


67

git如何这么快地检测到文件修改?

是否会对存储库中的每个文件进行哈希处理并比较SHA1?这会花费很多时间,不是吗?

或者它比较atimectime还是mtime


对于不同的平台可能有所不同。我对Git / Windows的运行方式特别感兴趣
Pacerier,2014年

Answers:


42

Git试图仅从lstat()值中就使工作树与索引匹配,因为回退文件内容非常昂贵。

Documentation / technical / racy-git.txt描述了使用哪些stat字段,以及如何避免由于低mtime粒度而导致的某些竞争条件。本文有更多详细信息

统计值不是防篡改的,请参阅futimens(3)。Git可能会愚弄丢失文件的更改;这不会损害内容哈希的完整性。


1
但是,每次提交都依赖于文件内容吗?还是在提交时就在猜测?
Pacerier,2014年

9

最初有mtime检查报告,例如“ git status”,但是当计算最终提交时,mtime无关紧要……SHA1很重要。


1
@Randal:我不认为这是真的,它总是做一个比较:gist.github.com/240775。如果仅使用mtime,git status您会在我所做的粘贴中看到修改。
jkp

2
@jkp我自己的跟踪显示,不变的工作树文件仅对lstat它们起作用。
东武

5

好吧,我很可能会猜到它正在使用多个stat()调用组合来确定可能已发生的变化,然后实际上是试图确定是否使用了差异化引擎。

您可以在此处查看diff引擎的代码以了解一些想法。我在代码库中进行了跟踪,以确保status命令确实调用了此代码(看起来很多东西!),实际上,当您知道Git在Windows上的性能很差时,所有这些都非常有意义。它使用仿真层来执行这些POSIX类型调用:git status在该平台上执行操作要慢一个数量级。

无论如何,只要从头到尾阅读所有代码(如果有时间我可能会稍后再说!),这就是我目前可以接受的范围……如果有人使用过该代码库,也许可以更加确定。

注意:另外一种可能的加速来自明智地使用inline函数,在明显有意义的地方,您可以在标题中清楚地看到这一点。

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


关心解释什么stat()/是什么?
哈森

2

根据平台的不同,您应该能够找出Git用来识别其状态的syscall。strace git status在Linux,truss git statusSunOS或Apple随Mac OS X附带的开发人员工具一起使用的基于DTrace的工具上尝试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.