数据对象

数据对象(Blob)是二进制数据组成的任意格式的数据。用人话来说,数据对象 就是 Git 仓库里的文本文件、源代码文件、图片等等数据。

首先,新建一个文件并加到仓库里:

  • 创建一个 Git 仓库
  • 把 README 文件存储到 Git 仓库

下图展示了把文件存储在 Git 仓库的步骤:

1

下面展开聊聊上图中的第四步,就是说把一个文件存储在 Git 仓库具体发生了什么。这个过程分成三步来解释:

git add 之后,Git 仓库里发生了什么?

2

  • 运行git add操作之后,Git 会根据 README 的内容计算出一个 40 位的哈希值。
  • 把 README 的内容拷贝到对象仓库,文件的哈希值作为文件名。
  • 把文件加到暂存区里。

git add 之后,.git 文件夹里面发生了什么?

3

Git 会把添加进来的文件保存在 .git/objects。哈希值的前两位 bc 会作为文件夹的名字,其余38位会用作这个文件夹下面文件的文件名。

加上注释

4

用作文件夹和文件名字的哈希值

从上面的图我们总结一下。

首先根据 README 计算出 40 位哈希值,这个哈希值可以用git hash-object [filename]命令查看:

$ git hash-object README
47c6340d6459e05787f644c2447d2595f5d3a54b

然后把这个文件的内容保存在.git/objects/<前两位哈希值>/<后面38位哈希值>文件夹下面。

当然,保存完了之后,还要把它加到暂存区。

注意事项

  • README 文件在.git/objects文件夹下是用哈希值而不是文件名来保存的,而这个哈希值又是根据内容计算出来的。这种存储方法就叫"内容寻址存储(content addressable storage)"。
  • 如果另一个文件的内容和 README 完全一样,那么哈希值也是一样的。这时候 Git 不需要再存一份。
  • Git 可以保存压缩的版本来节省空间。

数据对象的格式是怎样的?

5 上图详细说明了 Git blob 内部机制。

results matching ""

    No results matching ""