首页 > 解决方案 > git ls-tree blob sha 不是唯一的吗?

问题描述

我一直认为每个 git 对象都有一个独特的 sha。然后,当我列出一个 git 树时,我发现了这个:

...
100644 blob fc47072354934eb062321af9d1c4897244562b67    exp2f-inputs
100644 blob fc47072354934eb062321af9d1c4897244562b67    expf-inputs
...
100644 blob 7eb7bda5e433f5df0fd6fec001c69cab7a08ebdb    fmaxf-inputs
...
100644 blob 7eb7bda5e433f5df0fd6fec001c69cab7a08ebdb    fminf-inputs
...
100644 blob 50a97394769447a692318ccefe333b494da7cc97    log2f-inputs
100644 blob 50a97394769447a692318ccefe333b494da7cc97    logf-inputs
...

这些文件来自glibc

我的问题是,那些sha不应该对每个 git 对象都是唯一的吗?

标签: git

解决方案


每个Git 对象都有一个唯一 SHA。您列出的树对象包含对同一 blob 对象的多个引用。

Blob 对象基本上是文件的内容。这两个文件具有相同的内容,因此 Git 将它们存储为相同的 blob。

$ echo 'basset hounds got long ears' > file1
$ cp file1 file2
$ git hash-object -t blob file1 file2
a55bd80950a2a5fc0b43b76ec1b3da190efcd212
a55bd80950a2a5fc0b43b76ec1b3da190efcd212

这是 Pro Git book的 Git Objects 章节中树和 blob 对象之间关系的图示。

在此处输入图像描述

这就是这个文件树的存储方式......

new.txt       "new file"
test.txt      "version 2"
bak/
    test.txt  "version 1"

顺便说一句,这就是 Git 如何在每次提交时有效地存储每个文件的完整快照的方式。由于每次提交通常只更改几个文件,因此提交大多引用相同的树和 blob 对象。


推荐阅读