我一直认为每个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对象都是唯一的吗?
答案 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对象之间关系的说明。
这个文件树的存储方式......
new.txt "new file"
test.txt "version 2"
bak/
test.txt "version 1"
顺便说一句,这就是Git如何有效地存储每次提交的每个文件的完整快照。由于每次提交通常只更改一些文件,因此提交主要引用相同的树和blob对象。