有人可以解释一下 git 是如何在内部知道文件 X、Y 和 Z 已经改变的吗?识别文件尚未添加或已修改的幕后过程是什么?我问是因为,使用 Subversion 很容易弄清楚它通过在每个文件夹下都有一个 .svn
目录来跟踪这些东西,但是对于 git 我似乎找不到对这个的内部运作。我怀疑它会扫描所有子目录以查找更改,因为它速度非常快。
那么,出于好奇,它的内部工作原理是什么?
最佳答案
确定文件状态的机制相当简单。要知道哪些文件已暂存,只需将 HEAD
树与索引进行比较即可。任何仅出现在索引中的项目都已暂存以进行添加,所有仅出现在 HEAD
中的项目已被删除,任何不同的项目已暂存更改。
类似地,可以通过将索引与工作目录进行比较来检测未暂存的更改。
您的问题特别是问这怎么会这么快(毕竟,计算文件的 SHA1 散列并不是很快。)这是索引 - 也称为缓存 -又进来玩了。该指数也has fields for the file size and file modification time .因此,可以简单地stat(2)
磁盘上的文件并与索引的文件大小和文件修改时间进行比较,以了解是否对该文件进行哈希处理。
关于git - git如何在内部跟踪文件变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15765366/