git - git如何在内部跟踪文件变化?

标签 git version-control

有人可以解释一下 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/

相关文章:

多个项目之间的Git

version-control - 我可以将旧版本作为提示和推送(使用 Mercurial)吗?

svn externals ...是还是不是?

git - 如何更新 Github 克隆的存储库?

将未完成的本地分支推送到远程以进行备份的 Git 工作流思路

git - 从 CVS 迁移到 Git : $Id$ equivalent?

git - 如何将空目录添加到 Git 存储库?

css - 您需要在生产中部署 SASS 吗?

git - 在 git 提交期间清理输出和格式化 Jupyter 笔记本文件

java - Jenkins Git 集成问题