Git 是如何保存和记录数据的——数据对象
![Git是如何保存和记录数据的——数据对象](https://static001.geekbang.org/infoq/df/df74aa84829fe0aa4d3b8429e628796c.jpeg)
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
数据对象(blob)——保存文件内容
首先我们先来向 Git 仓库中存储数据
上面命令的功能是向 Git 仓库中存入 test content
,我们会看到输出了一串 40 位长度的内容,而且可以在 objects
目录下看到一个文件。
![](https://static001.geekbang.org/infoq/da/da87d5e23ece89347fedeb21db9fc2d6.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
这就是开始时 Git 存储内容的方式——一个文件对应一条内容,以该内容加上特定头部信息一起的 SHA-1 校验和为文件命名。 校验和的前两个字符用于命名子目录,余下的 38 个字符则用作文件名。
然后我们看看这个文件的内容:
![](https://static001.geekbang.org/infoq/d4/d45a7d8e8503d707d9601edef6f7a84b.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
我们会发现这个文件里面并不是test content
,那这个文件内容怎么就变了呢?
文件内容的存储过程:
首先生成一个头部信息,这个头部信息由几部分构成:类型的标记(这里是 blob)、空格、数据内容的长度,最后是一个空字节,比如刚刚的情况就是 "blob 16\u0000"
头部信息和原始数据拼接起来,然后计算出 SHA-1 校验和 ,这样就得到了上面的一串 40 位的值
具体存储的内容则通过 zlib 压缩,上面计算出的值前两位做目录,后 38 位做文件名生成文件并写入,压缩以后,原来的
test content
就变成上面图中的内容了
从 Git 仓库把内容取出
上面我们演示的是直接同 Git 仓库操作数据,包括存数据取数据,而我们实际开发中,一般都是操作文件,对文件进行版本控制
操作文件——对文件进行版本控制
下面我们来看看 Git 仓库是怎么对文件进行版本控制的
上述命令我们就创建了一个内容为 version 1 , 文件名为 test.txt 的文件,这个时候如果我们用 git status
命令可以查看当前工程所有状态(开头说的 3 种状态)的文件信息,以及操作提示,这个是一个很有用的命令
直接用上面写入内容的方法向 Git 仓库中写入数据,也就是
我们可以把内容取出来看看:
这就是存储文件的过程
上述方式有什么问题?
存储的内容没问题,那我的文件名呢?文件名去哪了?
我需要拿回之前的数据,我得记住每一个文件的 SHA-1 值,而且是每一个文件每一个版本!
怎么解决这些问题呢?这就需要 Git 中的第二个对象—— 树对象。下一次我们就来看看树对象
版权声明: 本文为 InfoQ 作者【AntDream】的原创文章。
原文链接:【http://xie.infoq.cn/article/a4f871c2862979543cce0a1a8】。文章转载请联系作者。
评论