git ls-tree blob不是唯一的吗?

时间:2018-05-30 20:39:30

标签: git

我一直认为每个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对象都是唯一的吗?

1 个答案:

答案 0 :(得分:5)

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

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

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

以下是Git Objects chapter of the Pro Git book中树和blob对象之间关系的说明。

enter image description here

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

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

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