【发布时间】:2017-11-24 01:35:33
【问题描述】:
从this post,计算Git中文件的哈希
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
我自己测试了两个空文件是否正确:
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 empty1.txt
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 empty2.txt
但是为什么 Git 会从哈希中排除文件名呢?它如何区分empty1.txt 和empty2.txt?
如果我将 empty1.txt 的名称更改为 empty2.txt,当我调用 git status 时,Git 如何跟踪该更改?
【问题讨论】:
-
Git 通过树形结构管理工作目录。在该树结构中,文件名以字典方式映射到 SHA-1 blob。所以树维护文件名和 SHA-1 之间的关系,而不是 blob 本身。
-
这个树结构是一个显式对象(例如 HashMap)吗?这个树结构和 Git 的结构是一样的吗——提交、树、blob、标签?
-
我不知道你所说的“显式”对象是什么意思,但是它存储在某个地方。是的,它是 Git 使用的四个对象之一。
-
嗯,有道理——所以当调用 status 时,Git 只是在提交树与其父树之间进行比较,对吧?
-
我不确定……我对 Git 实现的了解相当有限。我只是想指出,blob SHA-1 并不是唯一用于识别文件的东西,这些 blob 是树结构的一部分。