当前位置: 首页 > news >正文

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹,包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用:

  1. HEAD:指向当前所在的分支(或者是一个特定的提交)。

  2. branches:存储了每个远程分支的相关信息。

  3. config:存储了项目级别的Git配置信息,包括用户名、邮箱、远程仓库等。

  4. description:对于空的Git仓库,此文件内容为空。对于非空的Git仓库,描述该项目的文本。

  5. hooks:存放各种Git钩子(hooks)的目录,包括预定义的钩子模板和用户自定义的钩子脚本。

  6. index:包含了暂存区(stage)的内容,记录了即将提交的文件和相关元数据。

  7. info:包含一些辅助性的信息。

  8. logs:存储了每个引用(分支、标签等)的修改历史。

  9. objects:存储了Git仓库的对象(commits、trees和blobs)。

  10. refs:存储了所有的引用(分支、标签等)。

  11. config、ignore等:其他配置文件和设置。

这些文件和目录组合起来构成了一个完整的Git仓库,用于追踪、管理和存储项目的版本控制历史。通常情况下,不需要直接操作.git文件夹中的内容,而是通过Git命令和工具来管理和操作仓库。



随着项目提交次数的增多,.git目录占用的空间大小,往往可能会比项目源代码本身要大得多。

看一些知名项目,.git目录的大小

alt
alt
alt
alt
alt
alt
alt


etcd:

alt

rust:

alt

可见在.git目录下,objects文件夹占用了绝大多数空间

  • objects:存储了Git仓库的对象(commits、trees和blobs)

.git/objects目录存储了以下几种类型的对象:

  1. Blob对象:Blob对象存储了文件的内容。

  2. Tree对象:Tree对象表示一个目录。它引用了Blob对象和其他Tree对象,从而构建了文件系统的层次结构。

  3. Commit对象:Commit对象表示了一个项目的特定状态。它引用了一个Tree对象,记录了该状态的项目结构,同时还记录了父提交,提交者的信息,以及提交信息。

  4. Tag对象:Tag对象是对某个特定commit对象的引用,通常用于发布新版本等。

因此,.git/objects目录是Git仓库的核心,保存了你的所有提交历史和版本信息。如果删除这个目录,将会丢失你的所有版本历史。



然而,随着提交次数增多,会发现.git/objects目录变得非常大,尤其是在处理大型项目时。这种情况下,如果想要减小它的大小。以下是一些可能的方法:

  1. Git GC:运行git gc命令可以清理无用的对象并压缩Git仓库的大小。这个命令会删除那些不再被任何分支或标签引用的对象。

  2. Git Prune:如果git gc还不够,你可以尝试使用git prune命令,它会进一步清理那些不可达的对象。

  3. Reduce Repo Size:如果你的仓库中有大量的大文件,你可能需要使用像git-filter-repo这样的工具来删除这些文件并减小仓库的大小。

  4. Git LFS:如果你的项目需要处理大文件,你应该考虑使用Git Large File Storage(Git LFS)来处理这些文件。Git LFS将大文件存储在一个单独的位置,而不是在.git/objects目录中。

总之,不应该删除.git/objects目录,但可以使用上述方法来管理和减小它的大小。



alt

在一个 Git 仓库中,.git/objects 目录下包含了所有 Git 对象,这些对象包括:

  1. blob 对象:存储文件数据,每个文件都会被存储为一个 blob 对象。
  2. tree 对象:存储树形结构,每个目录会被存储为一个 tree 对象,tree 对象包含了指向文件 blob 对象和子目录 tree 对象的指针。
  3. commit 对象:存储提交信息,每个提交都会被存储为一个 commit 对象,commit 对象包含了指向根目录 tree 对象、父提交、提交作者、提交时间等信息的指针。
  4. tag 对象:存储标签信息,每个标签都会被存储为一个 tag 对象,tag 对象包含了指向某个 commit 对象、标签名、标签作者、标签信息等信息的指针。

.git/objects 目录下,每个对象都被存储为一个以 40 个字符的 SHA-1 值命名的文件,前两个字符作为目录名,后 38 个字符作为文件名。例如,一个 blob 对象的 SHA-1 值为 c4a7f3c8d5c9aeb7c6f6a7e1c4b8c7c2c8d5fc1f,那么它对应的对象文件就被存储在 .git/objects/c4/a7f3c8d5c9aeb7c6f6a7e1c4b8c7c2c8d5fc1f 中。

这些对象是 Git 仓库中的基本构建块,Git 使用这些对象来记录文件的历史版本和状态。在 Git 中,每个对象都可以通过唯一的 SHA-1 值来引用和访问。


alt

.git/objects/pack有什么作用?


.git/objects/pack 目录是 Git 用来存储压缩后的 Git 对象文件的目录,这些文件是通过 Git 的打包(packing)算法生成的。打包算法可以将多个 Git 对象文件压缩成一个更小的文件,这样可以减小 Git 仓库的占用空间,提高 Git 的性能。

在使用 Git 进行版本控制时,每次提交都会产生新的 Git 对象,这些对象会被直接存储为单独的文件。如果 Git 对象文件过多,会导致 Git 仓库的大小变得很大,从而影响 Git 的性能。为了解决这个问题,Git 提供了打包算法,将多个 Git 对象文件打包成一个文件,从而减小 Git 仓库的大小。

.git/objects/pack 目录中的文件都是经过压缩的 Git 对象文件,这些文件的文件名通常以 .pack 结尾。当 Git 需要访问某个 Git 对象时,它会先查找 .git/objects 目录下是否存在对应的 Git 对象文件,如果不存在,Git 会查找 .git/objects/pack 目录下的 .idx 文件,根据索引信息找到对应的 .pack 文件,并从中解压出需要的 Git 对象。

总之,.git/objects/pack 目录存储了 Git 对象的压缩文件,通过打包算法可以减小 Git 仓库的占用空间,提高 Git 的性能。


alt

.git/objects/pack中的pack和idx都是干什么用的?


.git/objects/pack 目录中的 .pack 文件和 .idx 文件都是用来存储 Git 对象的压缩文件的。

.pack 文件是经过打包算法压缩后的 Git 对象文件,多个 Git 对象文件被打包成一个 .pack 文件,从而减小 Git 仓库的占用空间。.pack 文件中包含了多个 Git 对象,每个对象都是经过 zlib 压缩的二进制数据。

.idx 文件是 .pack 文件的索引文件,它包含了 .pack 文件中压缩的 Git 对象的索引信息,包括每个 Git 对象的 SHA-1 值、偏移量和大小等信息。.idx 文件可以提高 Git 对象的访问速度,因为 Git 可以通过快速查找 .idx 文件中的索引信息,而不需要解压整个 .pack 文件来查找对应的 Git 对象。

当 Git 需要访问某个 Git 对象时,它会先查找 .git/objects 目录下是否存在对应的 Git 对象文件,如果不存在,Git 会查找 .git/objects/pack 目录下的 .idx 文件,根据索引信息找到对应的 .pack 文件,并从中解压出需要的 Git 对象。

总之,.git/objects/pack 目录中的 .pack 文件和 .idx 文件都是用来存储经过压缩的 Git 对象的,通过打包算法和索引文件可以减小 Git 仓库的占用空间,并提高 Git 对象的访问速度。


alt

图片来自一文讲透 Git 底层数据结构和原理[1]

可以用 git cat-file -t 查看每个 SHA-1 的类型,用 git cat-file -p 查看每个对象的内容和简单的数据结构。git cat-file 是 git 的瑞士军刀,是底层核心命令

alt



git原理:pack打包[2]

Git 仓库拆分[3]

Git 内部原理[4]

删除Git仓库中的大文件[5]



参考资料

[1]

一文讲透 Git 底层数据结构和原理: https://toutiao.io/posts/8ps7l8l/preview

[2]

git原理:pack打包: https://blog.csdn.net/dingfu6404/article/details/102410997

[3]

Git 仓库拆分: https://www.cnblogs.com/yazhidev/p/13737197.html

[4]

Git 内部原理: https://iissnan.com/progit/html/zh/ch9_4.html

[5]

删除Git仓库中的大文件: https://vra.github.io/2018/05/20/git-remove-large-file/

本文由 mdnice 多平台发布

相关文章:

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹,包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用: HEAD:指向当前所在的分支(或者是一个特定的提交)。 branches:存储…...

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…...

ORB-SLAM2算法12之单目初始化Initializer

文章目录 0 引言1 单目初始化Initializer1.1 构造函数1.2 成员函数1.2.1 Initialize1.2.2 FindHomography1.2.3 FindFundamental1.2.4 ReconstructH1.2.5 ReconstructF 2 总结 0 引言 ORB-SLAM2算法7详细了解了System主类和多线程、ORB-SLAM2学习笔记8详细了解了图像特征点提取…...

固定参数-以京东sign逆向为例

前言 在逆向过程中,需要结合frida或unidbg,对整个算法进行一步步的分析,有时候我们分析完某一部分,想要继续往下分析时,需要重新发起请求,这时候的参数往往都已经改变了,这样会打断我们的节奏&a…...

在macOS 上执行sed命令报错问题

错误描述 在macOS 上执行sed命令,报错 sed -i s/book/books/g demo.txt sed: 1: extra characters at the end of d command解决方法 原因是mac的和linux写法不一样 linux sed -i s/book/books/g demo.txtmac sed -i s/book/books/g demo.txt...

ARP欺骗

ARP协议: 地址解析协议,将IP地址转换为对应的mac地址,属链路层协议 ip地址: ip地址本义是为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,它的格式表示为:(A.B.C.D)。其…...

pip切换下载源(多种国内源)

pip切换下载源 一、pip二、使用步骤1.查看源2.切换源 一、pip pip 是一个现代的,通用的 Python 包管理工具 二、使用步骤 1.查看源 使用以下命令查看当前pip的下载源 pip config list2.切换源 在国内使用官方下载依赖往往速度慢,易出错&#xff0c…...

ARM Cortex-M 的 SP

文章目录 1、栈2、栈操作3、Cortex-M中的栈4、MDK中的SP操作流程5、Micro-Lib的SP差别1. 使用 Micro-Lib2. 未使用 Micro-Lib 在嵌入式开发中,堆栈是一个很基础,同时也是非常重要的名词,堆栈可分为堆 (Heap) 和栈 (Stack) 。 栈(Stack): 一种…...

【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c

作者:einyboy 【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c | 云非云计算机科学、自然科学技术科谱http://www.nclound.com/index.php/2023/09/03/%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E9%B2%B2%E9%B9%8Farm%E6%9E%84%E6%9E%B6openeuler%E6%93%8D%E4%BD%9C%E7%B3%BB%…...

k8s之存储篇---数据卷-挂载

挂载是指将定义在 Pod 中的数据卷关联到容器,同一个 Pod 中的同一个数据卷可以被挂载到该 Pod 中的多个容器上。 数据卷内子路径 有时候我们需要在同一个 Pod 的不同容器间共享数据卷。使用 volumeMounts.subPath 属性,可以使容器在挂载数据卷时指向数…...

无涯教程-JavaScript - TDIST函数

The TDIST function replaces the T.DIST.2T & T.DIST.RT functions in Excel 2010. 描述 该函数返回学生t分布的百分点(概率)​​,其中数值(x)是t的计算值,将为其计算百分点。 t分布用于小样本数据集的假设检验。使用此函数代替t分布的临界值表。 语法 TDIST(x,deg_fr…...

IP子网的划分

文章目录 一、子网掩码1. 产生背景2. 定义3. 分类 二、VLSM算法1. 得出下列参数2. 计算划分结果3. 举例子计算 三、常见子网划分对应关系四、练习IP编址题目需求解题1. 192.168.1.100/282. 172.16.0.58/263. 25.83.149.222/254. 100.100.243.18/205. 10.100.100.100/10 首先可以…...

弹性盒子的使用

一、定义 弹性盒子是一种用于按照布局元素的一维布局方法,它可以简便、完整、响应式地实现各种页面布局。 容器中存在两条轴,主轴和交叉轴(相当于我们坐标轴的x轴和y轴)。我们可以通过flex-direction来决定主轴的方向。 主轴(main axis&am…...

软件测试/测试开发丨Selenium 网页frame与多窗口处理

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27048 一、多窗口处理. 1.1、多窗口简介 点击某些链接,会重新打开⼀个窗⼜,对于这种情况,想在新页⾯上操作&#xff0…...

MySQL高阶语句(三)

一、NULL值 在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空…...

链表OJ练习(2)

一、分割链表 题目介绍: 思路:创建两个链表,ghead尾插大于x的节点,lhead尾插小于x的节点。先遍历链表。最后将ghead尾插到lhead后面,将大小链表链接。 我们需要在创建两个链表指针,指向两个链表的头节点&…...

ssh常用操作

ssh常用操作 SSH是一种安全协议,ssh是该协议的客户端程序,openssh-server则是该协议的服务端程序 常用系统都自带了ssh客户端程序,服务端程序则可能要安装 密码远程登陆 前提:服务器安装了openssh-server,未安装时…...

从AD迁移至AAD,看体外诊断领军企业如何用网络准入方案提升内网安全基线

摘要: 某医用电子跨国集团中国分支机构在由AD向AzureAD Global迁移时,创新使用宁盾网络准入,串联起上海、北京、无锡等国内多个职场与海外总部,实现平滑、稳定、全程无感知的无密码认证入网体验,并通过合规基线检查,确…...

Flutter系列文章-Flutter在实际业务中的应用

不同场景下的解决方案 1. 跨平台开发: 在移动应用开发中,面对不同的平台(iOS和Android),我们通常需要编写两套不同的代码。而Flutter通过一套代码可以构建适用于多个平台的应用,大大提高了开发效率&#x…...

FPGA | Verilog仿真VHDL文件

当VHDL模块中有Generic块时,应该怎么例化? VHDL模块代码 entity GenericExample isgeneric (DATA_WIDTH : positive : 8; -- 泛型参数:数据宽度ENABLE_FEATURE : boolean : true -- 泛型参数:是否启用特定功能);Port ( clk : …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

LangChain + LangSmith + DeepSeek 入门实战:构建代码生成助手

本文基于 Jupyter Notebook 实践代码,结合 LangChain、LangSmith 和 DeepSeek 大模型,手把手演示如何构建一个代码生成助手,并实现全流程追踪与优化。 一、环境准备与配置 1. 安装依赖 pip install langchain langchain_openai2. 设置环境变…...