Git 数据是怎么存储的

摘要:
DOCTYPE html˃…可以看到git存储存储了整个文件。DOCTYPE html˃结论git的数据存储数据结构是一种键值类型,git的底层生成四个数据对象。每个commit和git都必须存储所有文件内容,因此这将导致存储大量数据。因此,使用gitclone exxxrepo--depth1将产生极好的效果。由于数据量大,git自然不会使用明文传输文件,因此blob内容是用zlib压缩的,但我们无法用gitcat文件看到。参考sixgo Git数据存储原理分析

git 的数据存储数据结构是键值类型,git中底层生成了4中数据的对象

  • commit:commit 对象指向一个 tree 对象,并且带有相关的描述信息.
  • tree: 可以看作一个目录
  • blob: 通常用来存储文件的内容
  • tag:tag 对象包括一个对象名(SHA1签名)、对象类型、标签名、标签创建人的名字(“tagger”), 还有一条可能包含有签名(signature)的消息

Git 数据是怎么存储的第1张

上图出自 sixgo-Git数据存储的原理浅析

举例提交

> git commit -m 'chore: LAO'
[master (root-commit) 4b9fc1a] chore: LAO
 2 files changed, 57 insertions(+)
 create mode 100644 index.html
 create mode 100644 test.js

> git log
commit 4b9fc1a52e74ed4e408c4994296a1f960533f48b (HEAD -> master)
Author: Ever-lose <ever-lose@foxmail.com>
Date:   Mon May 4 19:28:20 2020 +0800

    chore: LAO

使用 git cat-file

# 获取此 commitid 的类型,是 commit
> git cat-file -t 4b9fc1a52e74ed4e408c4994296a1f960533f48b
commit

# 获取 tree
> git cat-file -p 4b9fc1a52e74ed4e408c4994296a1f960533f48b
tree 5937ab7ef5b6aaf4aad3ad4b09bfef7b97ee6e39
author Ever-lose <ever-lose@foxmail.com> 1588591700 +0800
committer Ever-lose <ever-lose@foxmail.com> 1588591700 +0800

chore: LAO

# 获取 blob
> git cat-file -p 5937ab7ef5b6aaf4aad3ad4b09bfef7b97ee6e39
100644 blob 0f7b3babfbcec4778ef50337115faf87e67fc682    index.html
100644 blob 39a772dd49196db8bfffb50a58bd10bac3dcb4ab    test.js

# 获取 index.html 里的 blob 内容
> git cat-file -p 0f7b3babfbcec4778ef50337115faf87e67fc682
<!DOCTYPE html>
<html lang="en">
<head>
... 省略

由此可知 git 存储是存储一整个文件的。并且能注意到项目目录的 .gitobjects 下有个目录叫 4b,里面有个叫 9fc1a52e74ed4e408c4994296a1f960533f48b 的文件,其实 4b 取自 commitId 里前两个字符,而 9fc1a52e74ed4e408c4994296a1f960533f48b 自然就是 commitId 里剩余的 38 个字符了。文件是二进制的,打开也看不明白。

第二次提交,笔者就修改了 index.html 里的第一行

> git commit -m 'chore: 第二次提交'
[master bd07fbb] chore: 第二次提交
 1 file changed, 1 insertion(+)

# 查看这两次提交
> git log --pretty=oneline
bd07fbb7f181f868191862e542da1636109e4e46 (HEAD -> master) chore: 第二次提交
4b9fc1a52e74ed4e408c4994296a1f960533f48b chore: LAO

# 获取 tree,注意下面 parent 是第一个 commitId
> git cat-file -p bd07fbb7f181f868191862e542da1636109e4e46
tree 2df4d0cfd56341eeecb705a6c5c3eaebb66d4c63
parent 4b9fc1a52e74ed4e408c4994296a1f960533f48b
author Ever-lose <ever-lose@foxmail.com> 1588592528 +0800
committer Ever-lose <ever-lose@foxmail.com> 1588592528 +0800

chore: 第二次提交

# 获取 blob
>  git cat-file -p 2df4d0cfd56341eeecb705a6c5c3eaebb66d4c63
100644 blob 114653874c6ed19c24c15f71532199aece94799d    index.html
100644 blob 39a772dd49196db8bfffb50a58bd10bac3dcb4ab    test.js

# 查看 index.html 的 blob 对象,下文的 <!-- 测试提交 --> 就是修改的内容
> git cat-file -p 114653874c6ed19c24c15f71532199aece94799d
<!-- 测试提交 -->
<!DOCTYPE html>
<html lang="en">

结论

git 的数据存储数据结构是键值类型,git中底层生成了4中数据的对象。

每个 commit,git 都要存储所有的文件内容,所以这样会导致存储的数据量很大。所以检出时使用 git clone xxxrepo --depth 1 会有奇效。

因为数据量大,git 自然不会采用明文传递文件了,所以 blob 内容是采用 zlib 进行数据压缩了的,只是我们用 git cat-file 看不出罢了。

参考

sixgo-Git数据存储的原理浅析

免责声明:文章转载自《Git 数据是怎么存储的》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mybatis的插件 PageHelper 分页查询使用方法vss安装,设置以及与vs2005联合项目操作(转) 子曰下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows平台使用Gitblit搭建Git服务器图文教程

Git服务现在独树一帜,相比与SVN有更多的灵活性,最流行的开源项目托管网站Github上面,如果托管开源项目,那么就是免费使用的,但是闭源的项目就会收取昂贵的费用,如果你不缺米,那么不在本文讨论的范围内,既然这样,我们可以自己搭建我们的Git服务器。 国内使用Windows Server平台的用户占大多数,那么本文就来讨论如何在Windows平台下搭建G...

玩转Redis之Window安装使用(干货)

     距离上次定Gc.Db框架,好久没有更新博客了,今日没什么事,就打算就Redis写点东西。      Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。      关于Redis,大家都不会陌生,网上关于Redis...

WinForm中DefWndProc、WndProc与IMessageFilter的区别

Windows消息系统由3部分组成:     1.消息队列。Windows应用程序的消息是由Windows统一在一个消息队列中管理的。     2.消息循环。应用程序从Windows消息队列中获得自己的消息,并将其分配给窗口过程进行处理。     3.窗口过程。负责处理接收到的消息,每个窗口都有对应的窗口过程,负责截获消息并响应。WndProc是窗口过程函...

红点系统设计思路

业务需求 在发布公告和有订单消息通知的时候,首页要出现红点。 点击到消息列表,查看消息详情,红点要消失。 数据库设计 红点信息表 red_point_info 字段 类型 备注 id char 主键 type tinyint 红点类型:1公告 2消息 target_key varchar target_ids的规则,比如说,role_...

Centrifugo  语言无关的实时消息服务

Centrifugo 语言无关的实时消息服务,基于golang编写,提供了websocket 以及sockjs 的兼容处理,使用上很简单 同时也支持基于redis的扩展,以下是一个简单的运行测试 环境准备 docker-compose 文件   version: "3" services: centrifugal: image: ce...

简单谈谈Netty的高性能之道

传统RPC 调用性能差的三宗罪 网络传输方式问题:传统的RPC 框架或者基于RMI 等方式的远程服务(过程)调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO 会由于频繁的wait 导致IO 线程经常性的阻塞,由于线程无法高效的工作,IO 处理能力自然下降。下面,我们通过BIO 通信模型图看下BIO 通信的弊端:   采用BIO...