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. ...
随机推荐
- bzoj2716
感人肺腑pascal过不去系列(可能是自己弱,因为有pascal过去了毕竟)那个这种平面点还有一种处理方法是kd tree,太弱了不会有时间学一下我还是用了cdq分治,首先肯定要把绝对值这个不和谐的东 ...
- Hibernate: org.hibernate.exception.SQLGrammarException: could not insert: 错误
最近在学习Java Web,今天刚接触Hibernate.学习的书籍是<轻量级Java EE企业应用实战(第3版)>.书中367页5.2.2中给予的Hibernate例子中的代码运行有以下 ...
- [ECNU 1624] 求交集多边形面积
求交集多边形面积 Time Limit:1000MS Memory Limit:30000KB Total Submit:98 Accepted:42 Description 在平面上有两给定的凸多边 ...
- 关于Sublime Text2 GBK编码的问题
很多文章都说需要"ConvertToUTF8"和"GBK Encoding Support"连个插件. 其实GBK Encoding Support完全不需要, ...
- nginx优化之请求直接返回json数据
对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间 location ~* (request/update)$ { d ...
- js打印的两种方法
第一种: <!--startprint1-->……打印的内容放在这里…… <!--endprint1--> //打印 function preview(DivID) { ) { ...
- uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
题意:求q次询问的静态区间连续最大和起始位置和终止位置 输出字典序最小的解. 思路:刘汝佳白书 每个节点维护三个值 pre, sub, suf 最大的前缀和, 连续和, 后缀和 然后这个题还要记录解的 ...
- centos6 kvm网卡桥接
以前用VMware,我的上司说,你既然都用CentOS的桌面,那就研究一下KVM. 好吧,上司做运维好几年了,就听了他的,装了一个KVM. KVM的网络默认是NAT,不方便,就学习BRIDGE!!! ...
- poj 3984 迷宫问题【bfs+路径记录】
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10103 Accepted: 6005 Description ...
- [三]ajax重要属性
readState:0初始化,1建立,2已接收,3处理中,4请求完成,响应就绪 status:200成功,404未找到页面失败 onreadystatechange:状态改变自动调用的方法 respo ...