美文网首页
浅析git底层存储原理 2021-07-14

浅析git底层存储原理 2021-07-14

作者: 9_SooHyun | 来源:发表于2021-07-15 11:22 被阅读0次

git三区

git三大区:工作区、暂存区和git版本库

1.git版本库

先从git版本库说起,git版本库对应.git/目录,里面的文件记录了整个仓库的文件内容、目录结构、commit信息和分支信息

2.工作区

工作区working tree对应硬盘上的代码文件,对代码进行编辑就发生在工作区。假设工作区的某个文件f 内容改变,经过 git add f 会在git仓库中产生对应的blob文件,可以在.git/objects下找到。blob文件以其sha1值命名,如58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c,文件内部记录了f文件修改后的全部内容(而不只是被修改的那部分内容),可使用git cat-file -p filename查看内容,使用git cat-file -t filename查看文件类型。

% git cat-file -p 58c9
111    ----->原有内容
20210715 add    -------->新增内容
% git cat-file -t 58c9
blob

这时,暂存区的索引将文件f指向新产生的blob文件,意味着文件f从工作区进入了暂存区。这也就是1中提到的关于文件内容的记录

3.暂存区

暂存区也叫索引区index area,git commit 之后,同样会在.git/objects下生成若干个以其sha1值命名的tree文件和1个commit文件,分别记录了commit时的目录结构和commit信息,对应1中所述

3.1 tree文件示例

tree文件的sha1值为df000d3eda8ddc32f967d3952c46e3323f0cf143

% git cat-file -t df00 
tree
% git cat-file -p df00
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c    test.txt

实际上,这个tree文件示例非常简单,它对应的是一个git仓库内只有一个test.txt的情况。当情况更为复杂,目录层级和文件增多时,一个tree文件也将变得复杂,例如:


仓库testgit

这是一个git仓库的顶层目录结构,对应的tree文件为:

% git cat-file -t 2d68
tree
% git cat-file -p 2d68
040000 tree 56cda59f78500ed97ad091a9c6e614c3f009d428    d1
100644 blob 96de81c7d8149d1537c0186852707435ee466cee    test.txt
100644 blob a5bce3fd2565d8f458555a0c6f42d0504a848bd5    test1.txt

可以发现,这个2d68的tree文件内除了记录了2个txt文件,还记录了一个tree文件,对应d1目录。这表明,一个tree实际上对应一层的目录结构

3.2 commit文件示例

commit文件的sha1值为90458f95cab4b136bfeab4f7dfeeee3f327fdee3

% git cat-file -t 9045
commit
% git cat-file -p 9045
tree df000d3eda8ddc32f967d3952c46e3323f0cf143
author xxx <xxx@xxx.com> 1626269618 +0800
committer xxx <xxx@xxx.com> 1626269618 +0800

add test.txt  -----> commit的注释

可以总结得到,git的存储逻辑基本上是,一个commit文件指向一个tree文件,一个tree文件又指向若干个tree文件和blob文件,一个blob文件记录了工作区对应文件的内容,而再通过.git/HEAD这个头指针文件和.git/refs下的heads来存储分支信息

xxx@xxx-MB0 .git % cat HEAD 
ref: refs/heads/master

xxx@xxx-MB0 .git % cat refs/heads/master
56911a2e7c7b1549ec88f2bfe9d77710b901389e

xxx@xxx-MB0 .git % git cat-file -p  refs/heads/master
tree 2d6899d21198d5c7bfc16d74ad812a179f617e88   --->testgit的顶层tree文件
parent 5e95ad6c966721b15e8eb0c9ce941018da108ca3
author xxx<xxx@xxx.com> 1626317303 +0800
committer xxx<xxx@xxx.com> 1626317303 +0800

add directory

参考:知乎-这才是真正的git

相关文章

  • 浅析git底层存储原理 2021-07-14

    git三区 git三大区:工作区、暂存区和git版本库 1.git版本库 先从git版本库说起,git版本库对应....

  • GIT实战

    git实战 git与svn的区别 git核心命令使用 git底层实现原理剖析 基于git通信协议搭建git私服 基...

  • Git底层原理

    git本质上是一个内容寻址的文件系统,并在此基础上提供了一个版本控制系统的界面。 一个已经初始化后的git...

  • 2018-07-12

    内容 基本原理 git 常用命令 较底层的原理 基本原理 Git 实际上是一个内容寻址系统。 Git 中保存的所有...

  • ElasticSearch底层原理浅析

    基本概念 索引(Index) ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数...

  • HashMap底层存储原理

    概念 HasnMap是基于map接口实现,元素以键值对的方式存储,并且键和值都可以使用null,因为key不允许重...

  • .git目录结构和数据保存形式

    这是看《Pro Git》底层原理的一点笔记。 Git目录 用git init Test命令创建一个空的Git仓库,...

  • 图文并茂,详细讲解Git底层存储原理

    自从小学妹学完定时任务后(详情请看上篇文章),对我那是百般仰慕,遇到问题第一时间就会想到我(是的,要的就是这种效果...

  • Git学习要点

    Git底层模型 git底层为一个key-value存储系统,它将文件的内容通过hash计算获得一个全局唯一的has...

  • redis-stream

    redis-stream 原理 底层维护了一个 radix tree,每个node存储了一个listpack 存储...

网友评论

      本文标题:浅析git底层存储原理 2021-07-14

      本文链接:https://www.haomeiwen.com/subject/qnkupltx.html