Git 存储过程探究

本文深入探讨了Git如何通过SHA1值定位commit、tree及blob对象,揭示了Git存储的实际过程。从commit对象出发,逐步剖析tree对象如何组织文件结构,最终定位到存储文件内容的blob对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git 存储过程探究


1 一些基础概念


1.1 SHA1


SHA1是密码学上的一种算法,git通过它来识别文件。在git中,通过对“对 象”进行计算得来的SHA1,来得到对该文件项目的索引。其中SHA1值是一个40 个字符大小的“对象名”。所有对该文件的索引,都是通过该SHA值进行的。


实例:


~/ChenOS$ git log

commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
Author: Li Shuo <lishuo.os.ds@gmail.com>
Date:   Sat Sep 1 08:44:26 2012 +0800

    在emacs下测试一下

commit 31ea7b0e2727c11250c45c0e4783a7c9bad79b42
Author: Li Shuo <lishuo.os.ds@gmail.com>
Date:   Sat Sep 1 07:44:38 2012 +0800

    对freedos进行忽略,不提交到版本库

commit 5380879d00d6cc47b68b43387715f844362c1e09
Author: Li Shuo <lishuo.os.ds@gmail.com>
Date:   Fri Aug 31 20:47:37 2012 +0800

    add freedos.img, modified bochsrc and make it into protectmode
commit c1007d90ff564de39dd4c5a53231cadf941816df
Author: Li Shuo <lishuo.os.ds@gmail.com>
Date:   Fri Aug 31 20:03:46 2012 +0800

其中的commit后面跟着的就是SHA值。


1.2 bolb对象


bolb用来存储文件的内容,它是一块二进制数据。Blob对象不像Tree或者 commit对象一样,它没有指向任何东西或者其它属性。所以说,它本质上就是 一个存放文件内容的仓库。


1.3 tree对象


一个tree对象通常有多个指向blob对象或者其它tree对象的指针,这个指针其 实就是一个SHA值。tree对象一般用来表示内容之间的目录和层次关系。


1.4 commit对象


commit对象指向一个tree对象,并且它本身带有一些相关的描述信息。


2 实例测试:


2.1 首先查看commit对象的SHA值


使用git last命令可以查看最近一次的提交,下面commit所跟的即是该次 commit的索引,我们可以利用该SHA值查看commit中的内容。


该命令的语法格式:

git last
~$ cd ChenOS/
~/ChenOS$ git last
commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
Author: Li Shuo <lishuo.os.ds@gmail.com>
Date:   Sat Sep 1 08:44:26 2012 +0800

    在emacs下测试一下


2.2 查看commit对象中的内容


从上一步中,我们找到了commit的SHA值,接下来可以使用该值查看commit的 存储结构。


该命令的语法格式:

git show -s --pretty=raw [commit-SHA]
~/ChenOS$ git show -s --pretty=raw 4931e7216c

commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
tree f5b7e53e20b4fc8aea3050863c8e69962850c4a6
parent 31ea7b0e2727c11250c45c0e4783a7c9bad79b42
author Li Shuo <lishuo.os.ds@gmail.com> 1346460266 +0800
committer Li Shuo <lishuo.os.ds@gmail.com> 1346460266 +0800

    在emacs下测试一下

从命令的输出结果上看,在commit中,存储这该commit的索引,以及tree对象,父对象,作者和提交者的信息。在这里,我们需要的只是tree对象的索引。


2.3 查看tree对象中内容


由上一步,我们找到了commit指向的tree对象,我们就查看tree对象里面存着 什么。


语法格式:

git ls-tree [tree-SHA]
~/ChenOS$ git ls-tree f5b7e53e20b
100644 blob e930018d222af541a6ec6ea93b7b09ae8af27141    .gitignore
100644 blob 83019b82b43bfdcff6cc3a0fb654a8c217644cb3    README
040000 tree 8034271b096fa202f664224651aade823918b4f3    V0.1

从输出可以很清楚的看到,tree对象里面包含着blob对象以及其它tree对象的索引。仔细看,其中那个tree对象索引是一个目录,跟上面两个的属性不一样。而在这里,我们需要的是blob对象,我们希望知道blob里面放着什么。


2.4 查看bolb对象中内容


语法格式:

git show [blob-SHA]
~/ChenOS$ git show e930018d222a
V0.1/freedos.img

*.img

*.bin

*.a

*.o

~/ChenOS$ git show 83019b82b4
This is my project of ChenOs.

It's small , but all made by myself.


我们再用cat看看这两个文件的内容:

~/ChenOS$ cat .gitignore 
V0.1/freedos.img

*.img

*.bin

*.a

*.o

~/ChenOS$ cat README 
This is my project of ChenOs.

It's small , but all made by myself.

看清楚了吧,两者实际上是一样的,也就是说blob对象存储着文件的内容。


3 总结


到现在,我们可以说基本上搞明白了git存储过程。Git通过SHA值找到commit对象,在commit对象中存储着对tree对象的索引;接着通过该tree索引,找到tree对象,tree对象中存储着对blob对象和其它tree对象的索引;最后,通过索引找到blob对象,而blob对象中则存储着实际的文件内容。整个过程完成。




Date: 2012-09-03 一

Author: hic

Org version 7.9.1 with Emacs version 23

Validate XHTML 1.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值