Git: 对象原理

原文: Git Internals - Git Objects
官方中文版: Git 内部原理 - Git 对象

本篇是官方文档翻译 具体实践请看 Git: 对象原理实践

1. Git 对象

Git是一个内容可寻址的文件系统。那是什么意思?这意味着Git的核心是一个简单的键值对数据库。这意味着您可以将任何类型的内容插入Git仓库,对于你插入的内容,Git将返回一个唯一的密钥,你可以使用该密钥来检索你插入的内容。

现在我们用git hash-object命令做演示,它获取一些数据,将其存储在.git/objects目录(the object database) 中,并返回引用该数据对象的唯一键值。

首先,初始化一个新的Git 仓库,验证objects目录中是否(可以预见)没有任何内容:

$ git init test
Initialized empty Git repository in /tmp/test/.git/
$ cd test
$ find .git/objects
.git/objects
.git/objects/info
.git/objects/pack
$ find .git/objects -type f

Git已经初始化了objects目录并在其中创建了pack和info子目录,但是没有常规文件。现在,让我们使用git hash对象创建一个新的数据对象,并手动将其存储在新的git数据库中:

$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4

在它最简单的形式中,git hash-object将获取您传递给它的内容,并只返回将用于存储在Git仓库中的唯一键值。然后-w选项告诉命令不要只是返回键值,而是将该对象写入数据库。最后,--stdin选项告诉git hash-object从标准输入中获取要处理的内容;否则,该命令将会从命令末尾读取文件名参数。

上述命令的输出是一个40个字符的校验和哈希。这是SHA-1hash一个正在存储的内容的校验和加上一个头,您将会稍微了解这一点。现在您可以看到Git是如何存储数据的:

$ find .git/objects -type f
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

如果您再次检查对象目录,可以看到它现在包含一个拥有新内容的文件。这就是Git最初如何将内容存储为一片一片的单个文件,并用内容及其头的SHA-1校验和命名。子目录以SHA-1的前2个字符命名,文件名是剩余的38个字符。

一旦在对象数据库中有了内容,就可以使用git cat-filet命令检查该内容。这个命令是用来检查Git对象的瑞士军刀。将-p传递到git cat-filet命令将会首先识别出内容类型,然后适当地显示:

$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content

现在,可以将内容添加到Git并再次将其取出。还可以对文件中的内容执行此操作。例如,可以对文件执行一些简单的版本控制。首先,创建一个新文件并将其内容保存在数据库中:

$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
83baae61804e65cc73a7201a7252750c76066a30

然后,将一些新内容写入文件,然后再次保存:

$ echo 'version 2' > test.txt
$ git hash-object -w test.txt
1f7a7a472abf3dd9643fd615f6da379c4acb3e3a

对象数据库现在包含此新文件的两个版本(

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值