git对象存储
之前提到当存储数据内容时,会在objects文件夹下存储一个git对象。我们花些时间来看看 Git 是如何存储对象的。你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象是如何被存储的。以git设计哲学中的test1.txt为例分析blob对象如何被计算校验和?如何被存储?是否和直接调用git命令的结果一致?
sha-1校验和计算
我们需要验证通过ruby计算出来的检验和与这个一致。
为了验证,新建一个git仓库
$ mkdir blobtest
$ cd blobtest
$ git init
Initialized empty Git repository in /Users/lyc/Desktop/tg/.git/
$ echo test1 > test1.txt
$ git add test1.txt
gitt使用'blob ' + len(content) + '\0' + content作为文件内容
blob表示对象类型为blob类型,
len表示内容的长度
\0为空字节
其中'blob ' + len(content) + '\0' 来组成一个header,然后再将这个header与真正的内容拼接起来,并计算拼接后的新内容的 SHA-1 校验和。
使用 irb 命令进入 Ruby 交互式模式:
$ irb
irb(main)::> content = "test1\n"
=> "test1\n"
irb(main)::> header = "blob #{content.length}\0"
=> "blob 6\u0000"
irb(main)::> store = header + content
=> "blob 6\u0000test1\n"
irb(main)::> require 'digest/sha1'
=> true
irb(main)::> sha1 = Digest::SHA1.hexdigest(store)
=> "a5bce3fd2565d8f458555a0c6f42d0504a848bd5"
可见计算出来的校验后与刚开始设定的校验和是一致的。
git对象存储
在git设计哲学中我们了解到test1.txt被git add命令添加到git仓库后,存储的路径如下
.git/
|--index
|--objects
| |--a5
| | |-- bce3fd2565d8f458555a0c6f42d0504a848bd5
我们通过ruby命令来对数据进行压缩然后存储,看看会发生什么。
Git 用 zlib 对数据内容进行压缩,在 Ruby 中可以用 zlib 库来实现。
irb(main)::> require 'zlib'
=> true
irb(main)::> zlib_content = Zlib::Deflate.deflate(store)
=> "x\x9CK\xCA\xC9OR0c(I-.1\xE4\x02\x00\x1D\xC5\x03\xF1"
最后将用 zlib 压缩后的内容写入磁盘。
git的存储的规则是:sha1值的前2位作为文件夹名,后38位作为文件名
irb(main)::> path = '.git/objects/' + sha1[,] + '/' + sha1[,]
=> ".git/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5"
irb(main)::> require 'fileutils'
=> true
irb(main)::> FileUtils.mkdir_p(File.dirname(path))
=> [".git/objects/a5"]
irb(main)::> File.open(path, 'w') { |f| f.write zlib_content }
=>
把它存储在.git的objects目录下
.git/
|--index
|--objects
| |--a5
| | |-- bce3fd2565d8f458555a0c6f42d0504a848bd5
这样就完成了一次blob对象的创建。
退出irb后,用git命令验证下创建对象的内容
$ git cat-file -p a5bce3fd2565d8f458555a0c6f42d0504a848bd5
test1
结果与test1.txt的内容一致。
执行git st命令查看下状态,
$ git st
On branch master Initial commit Untracked files:
(use "git add <file>..." to include in what will be committed) test1.txt
发现是untracked
再用git add命令
$ git st
On branch master Initial commit Changes to be committed:
(use "git rm --cached <file>..." to unstage) new file: test1.txt
再看.git/objects目录下,目录没变,还是
.git/
|--index
|--objects
| |--a5
| | |-- bce3fd2565d8f458555a0c6f42d0504a848bd5
结论:Git 以对象类型为起始内容构造一个文件头,本例中是一个 blob。然后添加一个空格,接着是数据内容的长度,最后是一个空字节 (null byte),接着用这个文件头和真正的内容拼接起来(不是文件名)计算校验和,然后用zlib对数据进行压缩,按照SHA-1 值的头两个字符作为子目录名称,剩余 38 个字符作为文件名保存压缩后的数据。这样就把一个文件存储到了git仓库中。
git对象存储的更多相关文章
- 腾讯云 COS 对象存储使用
目前使用腾讯云的对象存储cos服务,将本地的文件同步到cos中,看了腾讯云的用户文档,发现使用COS Migration 工具还是挺适合的. 原因 因为服务器已经安装有java环境,而cos的几个用户 ...
- [转帖]Git数据存储的原理浅析
Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008 写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- swift(Object Storage对象存储服务)(单节点)
# 在部署对象存储服务(swift)之前,你的环境必须包含身份验证服务(keystone); # keystone需要MySQL数据库,Rabbitmq服务,Memcached服务; # 内存:4G ...
- 对象存储 - Swift 原理 及 Swift+keystone+dashboard 架构搭建
1. 原理介绍 Swift 架构.原理及功能: http://www.cnblogs.com/sammyliu/p/4955241.html 总结的很详细也很全面,受益匪浅,感谢分享. 2. keys ...
- Git 内部原理之 Git 对象哈希
在上一篇文章中,将了数据对象.树对象和提交对象三种Git对象,每种对象会计算出一个hash值.那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题. Git对象的hash方法 ...
- 七牛云对象存储kodo使用体验
在这里,我使用了七牛云的对象存储Kodo,和阿里云的OSS,还有腾讯云的COS是同样的产品 oss相关术语 包依赖关系解决 unrecognized import path "golang. ...
随机推荐
- apache开源项目--Apache POI
Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式 ...
- 关于SharePoint 2010体系架构的几个话题
转:http://www.cnblogs.com/chenxizhang/archive/2011/12/18/2291658.html?ADUIN=85650109&ADSESSION=13 ...
- How to Set Word Document Properties with C#
Word properties shows a brief description about one document. Through properties, we can learn gener ...
- MVC系统过滤器、自定义过滤器
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- 安装Visual Studio2015后,使用VS2013开发的项目,在IIS访问都提示“公共语言运行时检测到无效的程序”的解决办法
1.安装VS2015后,.NET Framework4.6会替换掉 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 (如果使用的是windows7 64 ...
- VI编辑器的使用方法
一.vi的工作模式vi有两种工作模式: 编辑模式:用来输入和编辑文件的模式,屏幕上会显示用户的键入,按键不是被解释为命令执行,而是作为文本写到用户的文件中. 指令模式:用来编辑.存盘和退出文件的模 ...
- 免费的SqlServer优化辅助工具:SqlOptimize (原创)
主要用于收集客户服务器的数据库运行情况,导出-导入到本地分析. 本工具不会修改你的数据和结构,只会读取相关数据. 1)工具软件下载 http://files.cnblogs.com/files/dud ...
- oracle rac IP详解
rac环境下vip/public/private IP的区别 每个节点要2块网卡, 3个IP,虚拟IP或者叫做业务IP,单个网卡当掉可以“漂”到其他网卡是继续提供服务 在Oracle RAC环境下,每 ...
- MVC 5 第三章 HTML Helper
提及到HTML helper大家肯定不应该陌生, 因为在书写MVC View的时候肯定需要使用到它.一个HTML Help就是一个返回HTML字符串的方法,这个字符串表示你所期望的类型的内容.例如,你 ...
- leetcode—triangle
1.题目描述 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adj ...