数据对象
数据对象(Blob)是二进制数据组成的任意格式的数据。用人话来说,数据对象 就是 Git 仓库里的文本文件、源代码文件、图片等等数据。
首先,新建一个文件并加到仓库里:
- 创建一个 Git 仓库
- 把 README 文件存储到 Git 仓库
下图展示了把文件存储在 Git 仓库的步骤:
下面展开聊聊上图中的第四步,就是说把一个文件存储在 Git 仓库具体发生了什么。这个过程分成三步来解释:
git add 之后,Git 仓库里发生了什么?
- 运行
git add
操作之后,Git 会根据 README 的内容计算出一个 40 位的哈希值。 - 把 README 的内容拷贝到对象仓库,文件的哈希值作为文件名。
- 把文件加到暂存区里。
git add 之后,.git 文件夹里面发生了什么?
Git 会把添加进来的文件保存在 .git/objects。哈希值的前两位 bc 会作为文件夹的名字,其余38位会用作这个文件夹下面文件的文件名。
加上注释
用作文件夹和文件名字的哈希值
从上面的图我们总结一下。
首先根据 README 计算出 40 位哈希值,这个哈希值可以用git hash-object [filename]
命令查看:
$ git hash-object README
47c6340d6459e05787f644c2447d2595f5d3a54b
然后把这个文件的内容保存在.git/objects/<前两位哈希值>/<后面38位哈希值>
文件夹下面。
当然,保存完了之后,还要把它加到暂存区。
注意事项
- README 文件在
.git/objects
文件夹下是用哈希值而不是文件名来保存的,而这个哈希值又是根据内容计算出来的。这种存储方法就叫"内容寻址存储(content addressable storage)"。 - 如果另一个文件的内容和 README 完全一样,那么哈希值也是一样的。这时候 Git 不需要再存一份。
- Git 可以保存压缩的版本来节省空间。
数据对象的格式是怎样的?
上图详细说明了 Git blob 内部机制。