git如何在内部跟踪文件更改?

car*_*ing 14 git version-control

有人可以解释一下git如何在内部知道文件X,Y和Z已经改变了吗?在文件尚未添加或修改时识别的幕后流程是什么?我问,因为使用Subversion很容易弄清楚它通过.svn在每个文件夹下有一个目录来跟踪这些事情,但对于git我似乎无法找到对此内部工作的描述.我怀疑它扫描所有子目录的变化,因为它非常快.

所以,如果好奇,它的内部运作是什么?

Edw*_*son 14

确定文件状态的机制非常简单.要知道已经播放了哪些文件,只需HEAD使用索引对树进行区分即可.仅出现在索引中的任何项目都已暂存以供添加,任何仅出现的项目HEAD已被删除,并且任何不同的项目都已暂存更改.

类似地,可以通过使用工作目录区分索引来检测未分级的更改.

您的问题特别询问如何这么快(毕竟,计算文件的SHA1哈希值并不是很快.)这就是索引(也称为缓存)再次出现的地方.索引还包含文件大小和文件修改时间的字段.因此,可以简单地stat(2)将文件放在磁盘上,并与索引的文件大小和文件修改时间进行比较,以了解是否对文件进行散列.


std*_*all 6

您可以在Git Internals一章的免费书籍Pro-Git中找到答案

本章解释了git如何在引擎盖下工作.

正如Leo所说,git会检查文件的SHA1以查看它是否已更改,您可以像这样检查它(取自Git Internals):

$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
83baae61804e65cc73a7201a7252750c76066a30
Run Code Online (Sandbox Code Playgroud)

然后,将一些新内容写入该文件,并再次保存:

$ echo 'version 2' > test.txt
$ git hash-object -w test.txt
1f7a7a472abf3dd9643fd615f6da379c4acb3e3a
Run Code Online (Sandbox Code Playgroud)