Git本地仓库内部基本结构
Posted skiwnywh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git本地仓库内部基本结构相关的知识,希望对你有一定的参考价值。
Git本地仓库(本文不涉及远程仓库)的内部结构简单如下图:
这是一个appengine项目,刚从远程仓库中clone出来。这个目录下,除了.git目录外的都算作工作区。.git目录下有很多东西,这里只挑简单的描述。
1.objects目录存放的是实际的文件,当git add命令执行的时候,文件已经被存到了objects目录下。
.git/objects目录下的对象都有一个40位的id,前两位作为目录名,后38位作为文件名
.git/objects$ ls
00 06 0c 12 18 1f 26 2c 32 38 3e 44
这些对象主要是commit对象和tree对象(目录树)
2.index是一个索引文件。存放的是暂存区的整个目录树的信息,并且为目录树中的每个文件都保存了时间戳和长度。
当git add 将某个文件添加到暂存区的时候,index文件中添加了这个文件的基本信息。
当我们修改了工作区的某个文件(比如用touch config.js修改时间戳信息),这会导致该文件的时间戳发生变化,而index里面存放的仍然是旧的信息。
此时当我们执行git status命令来检查版本库的状况:
a. git status就会用config.js的时间戳和长度和index文件里面保存的config.js的时间戳和长度进行比较。
b. 如果相同,则认为没有改变。
c. 如果发现不同。git status会继续用config.js的文件现在的内容和旧版本的config.js(保存在.git/objects中)的内容进行比较。
d. 如果内容没有改变,就简单的将最新的config.js的时间戳信息更新到index文件中
e. 如果内容改变,则提示内容发生改变。但是并不更新index文件中的config.js的时间戳信息。
由于算法优先比较时间戳和长度,避免了当时间戳相同时的文件内容的比较,因此性能比较高。
因此,git add命令会做两件事情:
a.添加文件到暂存区(.git/objects)
b.添加文件索引到(.git/index)
3.当git commit被成功执行后,会产生一系列对象表示该commit的结果,都存储在.git/objects目录下。主要分成三部分:
a.tree对象表示当前commit时候的暂存区的目录树,tree对象的内容来自于.git/index文件。
b.blob对象
tree对象目录树中的文件总是以blob的对象被保存。如果tree中有三个文件,那么就有对应的三个blob对象,它们都能通过tree对象保存的这些blob对象的摘要信息(id,文件名,类型等)找到
c.commit对象
该对象记录了属于哪个tree对象,上一次commit的对象id,自己的id,作者等等。
因此,当git commit操作执行的时候,会:
a. 用.git/index文件保存的目录树创建tree对象,
b. 因此tree对象里面自然就指向了已经被git add添加到.git/objects中的blob文件。
c. .git/refs/heads/master文件保存了这次commit的id
4.HEAD文件保存了当前的branch,比如我的HEAD文件内容:
[email protected]:~/work/189/appengine/.git$ cat HEAD
ref: refs/heads/master
也就是说HEAD指向了master分支,如果存在多个分支,HEAD也可指向别的分支。
5. .git/refs 目录称为引用目录
引用就是一个文件,里面包含了一个commit id。.git/refs保存了所有的引用。
.git/refs/heads目录下保存的是分支引用,比如./git/refs/heads/master文件就是master分支的引用。
.git/refs/tags目录保存了tag引用。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
以上是关于Git本地仓库内部基本结构的主要内容,如果未能解决你的问题,请参考以下文章