在 git 中创建 blob 时会发生什么?

Kee*_*ggs 1 git binary blob

Git 将文件存储为 blob,然后使用 SHA-1 校验和作为密钥在其他 blob 中查找每个特定 blob,类似于标识文件的文件名。

那么这个黑魔法是如何运作的呢?也就是说,如何从一个文本文件开始并以一个 blob 结束?是通过取消引用文件的内存地址创建的 blob 还是其他什么?

tor*_*rek 5

Git 中几乎没有什么真正的魔力。非常神奇的一点是(是?)各种安全哈希算法 (SHA) 校验和设计、Git 对这些校验和的使用,以及它们如何形成一个默克尔树,但这比任何东西都更“数学魔法”别的。

\n\n

认为您实际上是在问“Git 如何得出哈希 ID”,而答案很简单:

\n\n
    \n
  • 查找文件的大小(以字节为单位)。以十进制打印,例如,123.
  • \n
  • 将打印尺寸以十进制形式放在单词blob和空格后面。附加一个 ASCII NUL 字符,b\'\\0\'例如在 Python 中。对前缀和数据进行哈希处理,结果是 blob 的哈希 ID:

    \n\n
    $ python3\n...\n>>> data = b"some file data\\n"\n>>> prefix = "blob {}\\0".format(len(data)).encode("utf-8")\n>>> import hashlib\n>>> h = hashlib.sha1()\n>>> h.update(prefix)\n>>> h.update(data)\n>>> h.hexdigest()\n\'a831035a26dd2f75c2dd622c70ee22a10ee74a65\'\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

我们可以使用 Git 的对象哈希器来检查:

\n\n
$ echo \'some file data\' | git hash-object -t blob --stdin\na831035a26dd2f75c2dd622c70ee22a10ee74a65\n
Run Code Online (Sandbox Code Playgroud)\n\n

哈希值匹配,因此这是仅由换行符终止的 15 字节行“某些文件数据”组成的任何文件的 blob 哈希值。请注意,哈希 ID 是由内容决定的:此处的文件无关紧要。(这意味着文件名必须并且确实存储在 Git 中的其他位置\xe2\x80\x94 中的一个或多个对象中。)

\n\n

(请注意,SHA-1 不再被认为是加密安全的。Git 正在慢慢迁移到其他哈希算法,但这里并不着急。请参阅新发现的 SHA-1 冲突如何影响 Git?

\n