“ .git里面都有些什么?”,我:“???”
背景
一个阳光明媚的早晨,一位同学跟我聊骚中聊到了git,突然问我:“你会用Git吗?” 我回答:“传代码经常用的,咋了?” 他继续追问:“.git里面都有啥啊” 我也不太懂原理,只能浅显地回答:“仓库吧,存代码的,还有些git命令。” 虽然秉持着能用就行的态度,但这个问题总是在脑海里阴魂不散, 于是便有了这篇文章
实操
我们随便打开一个有git过的项目文件, 文件夹中会出现名叫 .git的隐藏文件(win11需要勾选"查看->"显示"->"隐藏的项目"选项),我们点开来看看
我们挑几个主要的来讲
.git/hooks/
hooks
:存储钩子函数模板,用于在特定的Git操作(提交、推送、合并等)发生时触发
特定操作
.git/hooks/
目录中放置特定名称的脚本文件,这些 hook
默认不生效,去掉 .sample 后缀才会生效。这些钩子脚本可以用于执行代码质量检查、自动化构建、部署、测试等任务,以增强开发流程的自动化和规范性。
文件很多?没关系,我们先看文件名中间部分,是不是很眼熟,commit
,merge
,push
,都是我们常用的git命令,再看看前后缀,pre
,prepare
,post
...我们是不是可以粗略的判断这是有关git命令输入前后会执行的事情,我们点开pre-commit.sample
大致流程:
- 获取当前提交的引用对象(commit),如果是初始提交,则与一个空的树对象进行比较。
- 通过
git config
命令获取hooks.allownonascii
配置值,判断是否允许非ASCII文件名。 - 将输出重定向到标准错误输出。
- 使用
git diff
命令检查即将提交的文件名中是否存在非ASCII字符,如果存在,则打印错误消息并退出。
.git/info/
info
:仓库相关的配置和信息
1..git/info/exclude
:配置文件,用于定义要忽略
的文件和目录
我们可以在文件下方加入以下规则
2..git/info/refs
: 索引文件,文件记录了本地仓库和远程仓库中的引用信息,供 Git 进行版本控制和引用追踪
每一行都代表一个引用,由两部分组成:引用指向的对象的 SHA-1 校验和和引用的完整名称。
.git/logs/
logs
:存储引用日志信息。
.git/logs/refs
:存储各个引用的引用日志信息。
.git/logs/refs/heads
:存储当前分支的引用日志.git/logs/refs/remotes
:存储远程分支的引用日志
.git/logs/HEAD
:存储分支引用的变动记录。每次 HEAD 引用变动时,都会在该文件中记录变动的信息。
.git/objects/【关键】
objects
:存储所有对象(objects)的核心目录 官方文档
git对象
git使用git对象
来表示文件内容、目录结构和提交历史等信息。
在 git 中,有三种主要类型的对象
:
Blob
(文件内容对象):Blob
对象存储了文件的内容。每个文件都被表示为一个Blob
对象,并使用唯一的标识符(SHA-1 校验和)来识别。当提交文件时,git 会创建一个Blob
对象来保存文件的快照。Tree
(目录结构对象):Tree
对象存储了目录结构信息。它们类似于文件夹,可以包含其他 Blob 对象或其他Tree
对象。Tree
对象描述了项目的整个目录结构,以及每个文件和子目录的关联关系。Commit
(提交对象):Commit
对象存储了一次代码提交的元数据。它包含了作者、提交时间、提交消息等信息,并指向一个特定的 Tree 对象,表示该提交的快照。每次你提交代码时,git 会创建一个新的Commit
对象。 这些对象通过引用(refs
)相互关联,形成了一个包含项目历史记录的有向无环图(DAG
)。每次进行提交、创建分支、合并分支等操作时,git 会创建新的对象并更新引用,以记录项目的变化。
官方git数据结构示意图
.git/refs/
refs
:存储对象的引用(refs
)。引用是指向 Git 对象(如提交、分支、标签等)的指针,它们用于标识
和跟踪
这些对象
-
heads(当前分支): 指向当前分支的引用,包含指向分支引用的路径。
-
remotes(远程分支): 指向远程仓库的引用。在
.git/refs/remotes/
目录下,每个远程仓库都有一个对应的子目录,其中包含该仓库的远程分支引用。例如,.git/refs/remotes/origin/
目录存储了名为 "origin" 的远程仓库分支的引用。 -
tags(标签): 标签是指向特定提交的不可变指针,用于标记重要的版本。在
.git/refs/tags/
目录下,每个标签都有一个对应的文件。例如,.git/refs/tags/v1.0
文件表示名为 "v1.0" 的标签。
.git/config
config
:Git 仓库的配置文件
【core】
:git 核心功能相关的配置选项repositoryformatversion
:仓库的格式版本filemode
:设置是否跟踪文件的执行位bare
:指定仓库是否为裸仓库logallrefupdates
:设置是否记录所有引用的更新symlinks
:设置是否跟踪符号链接ignorecase
:设置是否忽略文件名的大小写
【remote】
:远程仓库配置【branch】
:分支配置【gui】
:可视化界面配置
.git/description
config
:仓库的简短描述或说明。
默认为空,文件的内容可以根据需要进行编辑和修改,其他人在浏览仓库时就可以快速了解仓库的概要信息。
.git/index
index
:索引二进制文件,也被称为暂存区(staging area)或缓存(cache)。
index
文件的主要作用是跟踪工作目录中的文件,并记录它们的元数据和索引信息。当你执行 git add
命令将文件添加到暂存区时,git 会将文件的快照和相关信息写入 index
文件中。
通过 index
文件,git 能够快速检查工作目录中文件的状态,并确定哪些文件已被修改、添加或删除。这使得 git 可以更高效地进行版本控制操作,如提交修改、创建分支、合并等。
转载自:https://juejin.cn/post/7368505674223845391