Git 教程 2-git 文件夹认识
每个 git 仓库下都有一个.git
文件夹,好奇其内部文件的作用,本文来学习这个文件夹
典型的.git
文件夹下有以下内容:
他们的作用如下
- description 文件:仅供 GitWeb 程序使用,我们无需关心
- config 文件:包含项目特有的配置选项
- info 目录:包含一个全局性排除(globalexclude)文件,用以放置那些不希望被记录在
- (尚待创建的).gitignore 文件:中的忽略模式(ignoredpatterns)
- hooks 目录:包含客户端或服务端的钩子脚本(hookscripts)
- objects 目录:存储所有数据内容
- refs 目录:存储指向数据(分支、远程仓库和标签等)的提交对象的指针
- HEAD 文件:指向目前被检出的分支
- (尚待创建的) index 文件:保存暂存区信息
Git 的底层存储逻辑?
Git 是一个内容寻址文件系统,也就是一个简单的键值对数据库。向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容
内容被添加到 Git 仓库后,.git/object 目录就创建一个新文件,可使用 git hash-object 查看内容的键
Git 存储内容命名方式
一个文件对应一条内容, 以该内容加上特定头部信息一起的 SHA-1 校验和为文件命名。 校验和的前两个字符用于命名子目录,余下的 38 个字符则用作文件名
Git 的树对象
Git 所有内容均以树对象和数据对象的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象则大致上对应了 inodes 或文件内容
一个树对象包含了一条或多条树对象记录(tree entry),每条记录含有一个指向数据对象或者子树对象的 SHA-1 指针,以及相应的模式、类型、文件名信息
通常,Git 根据某一时刻暂存区(即 index 区域,下同)所表示的状态创建并记录一个对应的树对象, 如此重复便可依次记录(某个时间段内)一系列的树对象