Git内部存储原理简析

mac2025-12-11  10

git基础入门请参考之前的博文

1、.git目录结构

hooks:钩子程序,可以被用于在执行git命令时自动执行一些特定操作; info :保存了不希望在.gitignore文件中管理的忽略模式 logs :存储操作日志目录 objects :保存git对象(数据)的目录,包括三类对象commit、tree和blob refs :保存分支和tag的当前提交指针 config :项目配置文件 description:项目描述文件 HEAD:当前分支head文件位置(如ref: refs/heads/dev) index:暂存区信息

2、Git 对象

Git 的核心部分是一个简单的键值对数据库(key-value data store)。 主要的 Git 对象——数据对象、树对象、提交对象(“blob”“tree” “commit” )——最初均以单独文件的形式保存在 .git/objects 目录下:Git为对象生成一个文件,并根据文件信息生成一个SHA-1哈希值作为文件内容的校验和,创建以该校验和前两个字符为名称的子目录,并以(校验和)剩下38个字符为文件命名,将该文件保存至子目录下。 blob是最基本的存储单元,当文件发生变化是,就会生成新的hash值,那么它上层的tree的hash值也会发生变化。一直影响到顶层的tree。在每次提交时,如何文件的内容不发生变化,该文件就不会再次保存(也就是不会生成新的hash,还是用之前的)。

tree对象:可以看作一个目录,管理一些“tree”对象或是“blob”对象。它有一串指向“blob”对象或是其它“tree”对象的指针,一般用来表示内容之间的目录层次关系(就像文件和子目录)。blob对象: 一个“blob”通常用来存储文件的内容。一个“blob”对象就是一块二进制数据,blob对象的键是根据SHA1算法生成的,所以若两个文件在一个目录树或是一个版本仓库中有同样的数据内容,那么它们将会共享同一个“blob”对象,和其所对应的文件所在路径、文件名是否改被更改都完全没有关系。commit对象:“commit”对象指向一个“tree对象”,并且带有相关的描述信息,标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交的指针等等。

查看提交日志 git log 查看提交内容 git cat-file -p commitid

这里可以看到一个tree对象,然后再查看这个tree。 这里可以看到blob对象,再次查看一个blob对象,也就是对应文件的内容

3、完整目录结构

.git ├── COMMIT_EDITMSG ├── config ├── description ├── HEAD ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │ ├── pre-commit.sample │ ├── pre-push.sample │ ├── pre-rebase.sample │ ├── pre-receive.sample │ ├── prepare-commit-msg.sample │ └── update.sample ├── index ├── info │ └── exclude ├── logs │ ├── HEAD │ └── refs │ └── heads ├── objects │ ├── 17 │ │ └── 629cfbc34f6586e490f792b08d6d779b1a44ca │ ├── 21 │ │ └── 515baf3ffbb45387c92312e839fae087aadd22 │ ├── 34 │ │ └── 1e54913a3a43069f2927cc0f703e5a9f730df1 │ ├── 46 │ │ └── 55601783410b2c4369d90d93720f89da98877d │ ├── 56 │ │ └── 10bbe862888c4ee739271047a9093112114e90 │ ├── 57 │ │ └── b8f340105c4f2fe303ad78641ede803e6993ff │ ├── 5e │ │ └── 72b3749d028bf702a5b17a1a12d44e3e5c37f6 │ ├── 8b │ │ └── 137891791fe96927ad78e64b0aad7bded08bdc │ ├── 94 │ │ └── 0c6346cc80bdfd863fbe7c7adde8754f90a0a0 │ ├── b2 │ │ └── e6b516dd3f20ebcad9527ee121325bd4f4909b │ ├── bc │ │ └── 2f871b2ef1ef8eb4e15ef6f478c95672febdec │ ├── e6 │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ ├── f9 │ │ └── e321feff349ed74d65bb2e304863f8f57cc4e2 │ ├── info │ └── pack ├── refs │ ├── heads │ │ ├── dev │ │ └── master │ └── tags └── readme.md

最新回复(0)