分类:
2012-09-05 12:44:56
原文地址:Git 存储过程探究 作者:无赖皮肤
SHA1是密码学上的一种算法,git通过它来识别文件。在git中,通过对“对象”进行计算得来的SHA1,来得到对该文件项目的索引。其中SHA1值是一个40 个字符大小的“对象名”。所有对该文件的索引,都是通过该SHA值进行的。
实例:
其中的commit后面跟着的就是SHA值。
bolb用来存储文件的内容,它是一块二进制数据。Blob对象不像Tree或者 commit对象一样,它没有指向任何东西或者其它属性。所以说,它本质上就是一个存放文件内容的仓库。
一个tree对象通常有多个指向blob对象或者其它tree对象的指针,这个指针其实就是一个SHA值。tree对象一般用来表示内容之间的目录和层次关系。
commit对象指向一个tree对象,并且它本身带有一些相关的描述信息。
使用git last命令可以查看最近一次的提交,下面commit所跟的即是该次 commit的索引,我们可以利用该SHA值查看commit中的内容。
该命令的语法格式:
测试:
从上一步中,我们找到了commit的SHA值,接下来可以使用该值查看commit的存储结构。
该命令的语法格式:
从命令的输出结果上看,在commit中,存储这该commit的索引,以及tree对象,父对象,作者和提交者的信息。在这里,我们需要的只是tree对象的索引。
由上一步,我们找到了commit指向的tree对象,我们就查看tree对象里面存着什么。
语法格式:
测试:
从输出可以很清楚的看到,tree对象里面包含着blob对象以及其它tree对象的索引。仔细看,其中那个tree对象索引是一个目录,跟上面两个的属性不一样。而在这里,我们需要的是blob对象,我们希望知道blob里面放着什么。
语法格式:
测试:
我们再用cat看看这两个文件的内容:
看清楚了吧,两者实际上是一样的,也就是说blob对象存储着文件的内容。
到现在,我们可以说基本上搞明白了git存储过程。Git通过SHA值找到commit对象,在commit对象中存储着对tree对象的索引;接着通过该tree索引,找到tree对象, tree对象中存储着对blob对象和其它tree对象的索引;最后,通过索引找到blob 对象,而blob对象中则存储着实际的文件内容。整个过程完成。