“ .git里面都有些什么?”,我:“???”

背景

一个阳光明媚的早晨,一位同学跟我聊骚中聊到了git,突然问我:“你会用Git吗?”
我回答:“传代码经常用的,咋了?”
他继续追问:“.git里面都有啥啊”
我也不太懂原理,只能浅显地回答:“仓库吧,存代码的,还有些git命令。”
虽然秉持着能用就行的态度,但这个问题总是在脑海里阴魂不散,
于是便有了这篇文章

实操

我们随便打开一个有git过的项目文件,
文件夹中会出现名叫 .git的隐藏文件(win11需要勾选"查看->“显示”->"隐藏的项目"选项),我们点开来看看

image.png
我们挑几个主要的来讲

.git/hooks/

hooks:存储钩子函数模板,用于在特定的Git操作(提交、推送、合并等)发生时触发特定操作

.git/hooks/目录中放置特定名称的脚本文件,这些 hook 默认不生效去掉 .sample 后缀才会生效。这些钩子脚本可以用于执行代码质量检查、自动化构建、部署、测试等任务,以增强开发流程的自动化和规范性。

image.png

文件很多?没关系,我们先看文件名中间部分,是不是很眼熟,commitmergepush,都是我们常用的git命令,再看看前后缀prepreparepost…我们是不是可以粗略的判断这是有关git命令输入前后会执行的事情,我们点开pre-commit.sample
image.png

大致流程

  1. 获取当前提交的引用对象(commit),如果是初始提交,则与一个空的树对象进行比较。
  2. 通过git config命令获取hooks.allownonascii配置值,判断是否允许非ASCII文件名。
  3. 将输出重定向到标准错误输出。
  4. 使用git diff命令检查即将提交的文件名中是否存在非ASCII字符,如果存在,则打印错误消息并退出。

.git/info/

info:仓库相关的配置和信息

image.png

1..git/info/exclude :配置文件,用于定义要忽略的文件和目录
image.png

我们可以在文件下方加入以下规则

image.png

2..git/info/refs : 索引文件,文件记录了本地仓库和远程仓库中的引用信息,供 Git 进行版本控制和引用追踪
image.png
每一行都代表一个引用,由两部分组成:引用指向的对象的 SHA-1 校验和和引用的完整名称

.git/logs/

logs :存储引用日志信息。

image.png
.git/logs/refs:存储各个引用的引用日志信息。

  • .git/logs/refs/heads :存储当前分支的引用日志
    0cffdde3a8635324ea757dc749f8bc4.jpg
  • .git/logs/refs/remotes :存储远程分支的引用日志
    62c037bce8c1371f4fb07dd94ac185f.jpg

.git/logs/HEAD:存储分支引用的变动记录。每次 HEAD 引用变动时,都会在该文件中记录变动的信息。

.git/objects/【关键】

objects:存储所有对象(objects)的核心目录 官方文档

image.png

image.png

git对象

git使用git对象来表示文件内容、目录结构和提交历史等信息。
在 git 中,有三种主要类型的对象

  • Blob(文件内容对象): Blob 对象存储了文件的内容。每个文件都被表示为一个 Blob 对象,并使用唯一的标识符(SHA-1 校验和)来识别。当提交文件时,git 会创建一个 Blob 对象来保存文件的快照。
  • Tree (目录结构对象): Tree 对象存储了目录结构信息。它们类似于文件夹,可以包含其他 Blob 对象或其他 Tree 对象。Tree 对象描述了项目的整个目录结构,以及每个文件和子目录的关联关系。
  • Commit (提交对象): Commit 对象存储了一次代码提交的元数据。它包含了作者、提交时间、提交消息等信息,并指向一个特定的 Tree 对象,表示该提交的快照。每次你提交代码时,git 会创建一个新的 Commit 对象。
    这些对象通过引用(refs)相互关联,形成了一个包含项目历史记录的有向无环图(DAG)。每次进行提交、创建分支、合并分支等操作时,git 会创建新的对象并更新引用,以记录项目的变化。

image.png

官方git数据结构示意图

image.png

.git/refs/

refs:存储对象的引用(refs)。引用是指向 Git 对象(如提交、分支、标签等)的指针,它们用于标识跟踪这些对象

image.png

  • heads(当前分支): 指向当前分支的引用,包含指向分支引用的路径。
    image.png

  • remotes(远程分支): 指向远程仓库的引用。在 .git/refs/remotes/ 目录下,每个远程仓库都有一个对应的子目录,其中包含该仓库的远程分支引用。例如,.git/refs/remotes/origin/ 目录存储了名为 “origin” 的远程仓库分支的引用。
    image.png

  • tags(标签): 标签是指向特定提交的不可变指针,用于标记重要的版本。在 .git/refs/tags/ 目录下,每个标签都有一个对应的文件。例如,.git/refs/tags/v1.0 文件表示名为 “v1.0” 的标签。
    image.png

.git/config

config:Git 仓库的配置文件

image.png

  • 【core】:git 核心功能相关的配置选项
    • repositoryformatversion:仓库的格式版本
    • filemode:设置是否跟踪文件的执行位
    • bare:指定仓库是否为裸仓库
    • logallrefupdates:设置是否记录所有引用更新
    • symlinks:设置是否跟踪符号链接
    • ignorecase:设置是否忽略文件名的大小写
  • 【remote】远程仓库配置
  • 【branch】分支配置
  • 【gui】可视化界面配置

.git/description

config:仓库的简短描述或说明。

image.png
默认为空,文件的内容可以根据需要进行编辑和修改,其他人在浏览仓库时就可以快速了解仓库的概要信息。

.git/index

index:索引二进制文件,也被称为暂存区(staging area)或缓存(cache)。

index 文件的主要作用是跟踪工作目录中的文件,并记录它们的元数据和索引信息。当你执行 git add命令将文件添加到暂存区时,git 会将文件的快照和相关信息写入 index 文件中。
通过 index 文件,git 能够快速检查工作目录中文件的状态,并确定哪些文件已被修改添加删除。这使得 git 可以更高效地进行版本控制操作,如提交修改、创建分支、合并等。

image.png

  • 33
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值