“blob”是我放在git存储库中的文件内容的同义词吗?

时间:2016-09-21 21:44:45

标签: git

一位知识渊博的人回答了我一个比较复杂的git问题似乎在这个问题的标题中有解释,我不同意这一点,所以这是一个甚至可以折磨专家git用户的误解。

我将提供自己的理解作为答案 - 我很高兴你能够改进或批准(或两者兼而有之!) - 但是可以随意添加与我的解释有很大不同的答案。

1 个答案:

答案 0 :(得分:2)

不,虽然这个术语的冲突用法很容易找到,但在某些重要的方面," blob"不是放在git存储库中的文件内容的同义词。

首先,blob对象包含(顺序):

  • 单词" blob"
  • 一个空间
  • 以空字符结尾的字符串,表示文件中的字节数
  • 您文件中的实际(逐字)数据

如果你的文件数据是blob,那么这个blob内容的定义将是递归的。

其次,git存储blob的哈希值,而不是文件的哈希值。从git(1)手册页:

  

所有对象都以其内容的SHA-1哈希命名,通常写为40个十六进制数字的字符串

如果blob对象和你的文件是同一个东西,它们会有相同的哈希值。他们没有:

$ printf "a" > file
$ openssl sha1 file
SHA1(file)= 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
$ git hash-object file
2e65efe2a145dda7ee51d1741299f848e5bf752e
$ printf "blob %d\000$(cat file)" $(wc -c file | awk '{print $1}') > file-blob
$ openssl sha1 file-blob
SHA1(file-blob)= 2e65efe2a145dda7ee51d1741299f848e5bf752e

正如您所看到的,file-blob的SHA1,根据上面定义的blob的内容构造,匹配git存储的哈希来表示file,我们从中获取git-hash-object(1)

第三种,也许是更迂腐的理由是因为将blob视为同义词可能会误导那些知道" blob"来自其他环境,例如数据库,其中有一个" BLOB" (二进制大对象)可能是您存储内容的逐字表示。

总结:虽然很多人使用" blob"作为存储库中文件内容的一种替代,用git的说法,它不是一回事。尽管blob对象代表您的文件并包含其数据(在ASCII标题字符串之后),但任何相似之处纯属巧合。