git - 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 对象都有一个唯一 的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 对象。
推荐阅读
- python - 我收到 python 错误 - AttributeError: 'str' object has no attribute 'items'
- java - Android - RecyclerView 在 ViewHolder 中获取变量
- javascript - 在 Blazor WebAssembly 中使用 emscripten 编译的 js/wasm
- c# - C# - 连接对先前创建的实例的引用?
- r - R:使用 tidyverse 将 NA 替换为 df 中的其他变量
- django - 为什么 Django REST Framework Router 会破坏查询参数过滤?
- graphql - Gatsby + Contentful - 如何在不重新启动服务器的情况下在本地重做 GraphQL 查询(npm run dev)?
- java - 处理异常时无法转发到jsp
- reactjs - Vis JS 图形布局已更改
- flutter - 如何在TextFormField的左上角开始文本