car*_*ing 14 git version-control
有人可以解释一下git如何在内部知道文件X,Y和Z已经改变了吗?在文件尚未添加或修改时识别的幕后流程是什么?我问,因为使用Subversion很容易弄清楚它通过.svn在每个文件夹下有一个目录来跟踪这些事情,但对于git我似乎无法找到对此内部工作的描述.我怀疑它扫描所有子目录的变化,因为它非常快.
所以,如果好奇,它的内部运作是什么?
Edw*_*son 14
确定文件状态的机制非常简单.要知道已经播放了哪些文件,只需HEAD使用索引对树进行区分即可.仅出现在索引中的任何项目都已暂存以供添加,任何仅出现的项目HEAD已被删除,并且任何不同的项目都已暂存更改.
类似地,可以通过使用工作目录区分索引来检测未分级的更改.
您的问题特别询问如何这么快(毕竟,计算文件的SHA1哈希值并不是很快.)这就是索引(也称为缓存)再次出现的地方.索引还包含文件大小和文件修改时间的字段.因此,可以简单地stat(2)将文件放在磁盘上,并与索引的文件大小和文件修改时间进行比较,以了解是否对文件进行散列.
您可以在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)
| 归档时间: |
|
| 查看次数: |
7453 次 |
| 最近记录: |