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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解排序算法(附带Java/Python/Js源码)

冒泡算法 依次比较两个相邻的子元素,如果他们的顺序错误就把他们交换过来,重复地进行此过程直到没有相邻元素需要交换,即完成整个冒泡,时间复杂度。 比较相邻的元素。如果第一个比第二个大,就交换它们两个;…

为何电商行业都在争相使用WhatsApp引流小挂件?

WhatsApp小挂件是嵌入在网站上的聊天小部件,允许访问者同WhatsApp与您联系。点击后,它会将客户带到移动或桌面 WhatsApp应用程序,或者直接打开一个对话框,客户可以在这些地方与您发起对话。让我们看看在您的网站上拥有WhatsApp聊天…

常用激活函数整理

最近一边应付工作,一边在补足人工智能的一些基础知识,这个方向虽然新兴,但已是卷帙浩繁,有时不知从何入手,幸亏有个适合基础薄弱的人士学习的网站,每天学习一点,积跬步以至千里吧。有像我一样学…

PHP多语言代入电商平台api接口采集拼多多根据ID获取商品详情原数据示例

拼多多商品详情原数据API接口的作用是获取拼多多电商平台上某一商品的详细信息,包括商品的标题、价格、库存、图片、描述、包邮信息、销量、评价、优惠券等数据。通过该API接口可以获取到商品的原始数据,用于分析、筛选和展示商品信息。 pinduoduo.item…

复习之docker部署--项目实战

一、实验环境 1.安装7.6虚拟机 最小化安装,不安装图形! 2.封装虚拟机 关闭selinux关闭防火墙关闭networkmanager配置网络,保证可以ssh修改主机名添加双向解析配置7.6网络仓库--安装常用的工具 配置完成后,在真机ssh虚拟机 如果…

在Mac终端使用unrar和rar 解压和压缩软件

1、首先从rarlab 网站下载 rar / unrar 工具 rarlab网站: https://www.rarlab.com/download.htm 2、解压缩下载的 tar.gz 压缩包(rarmacos-x64-623.tar.gz),在下载目录downloads下自动创建一个rar的目录,其…

从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置

1. SSH 无密登录配置 1.1 配置 ssh (1)基本语法 ssh 另一台电脑的IP地址 (2)ssh 连接时出现 Host key verification failed 的解决方法 [atguiguhadoop102 ~]$ ssh hadoop103(3)回退到 hadoop102 [at…

bazel入门学习笔记

简介 Bazel Google开源的,是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目,可为多个平台构建输出。Bazel支持任意大小的构建目标,并支持跨多个代码库和大量用户的大型代…

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口,登陆成功后,服务端会生成一个JWT令牌,并返回给前端&#xff0…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Unity Canvas动画不显示的问题

问题描述: 我通过角色创建了一个walk的动画,当我把这个动画给到Canvas里面的一个image上,这个动画就不能正常播放了,经过一系列的查看我才发现,canvas里面动画播放和非canvas得动画播放,他们的动画参数是不一样的。一个…

2D-2D对极几何中的基本矩阵、本质矩阵和单应矩阵

本文主要参考高翔博士的视觉SLAM十四讲第二版中的7.3章节内容。文章目录 1 对极约束2 本质矩阵E3 单应矩阵 1 对极约束 现在,假设我们从两张图像中得到了一对配对好的特征点,如图7.9所示(假如后面我们有若干对这样的匹配点,根据这…

高效使用WMS仓储管理系统,需要关注这八个点

在现代供应链中,WMS仓储管理系统扮演着至关重要的角色。然而,随着供应链需求的不断增长和变化,实施WMS仓储管理系统面临着越来越多的挑战和要求。本文将探讨使用WMS仓储管理系统需要考虑的8大因素,以适应现代供应链的需求。 一、W…

树和二叉树基础

引言: 树是一种非线性的结构,也是由一个一个的结点构成。 树的一些基本概念: 节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的度为6 叶节点或终端节点:度为0的节点称为叶节点。…

优秀的ui设计作品(合集)

UI设计师需要了解的九个Tips 1.图片类APP排版突破 规则是死的,人是活的。很多时候,如果需求是比较宽要尝试突破原则,用一些另类的排版方式,其实也是做好设计的本质。在图片类app中,错落一些的排版会使你的作品更有魅力…

Metinfo6.0.0任意文件读取漏洞复现

漏洞原理 在\MetInfo6.0.0\app\system\include\module\的old_thumb.class.php文件 可以看到这里对./进行了严格的过滤,但是却忽略了在Windows下还可以用…\来跳转目录 环境搭建 下载Metinfo6.0.0 配置随便写,自己记住就行 这里前面已经审计过代码了&a…

基于YOLOv8分割模型实现垃圾识别

基于YOLOv8分割模型实现垃圾识别 本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 YOLOv8是Ultralytics开源的一个非常火的AI算法,目前支持目标检测、实例分割、姿态估计等任务。如果对YOLOv8的安装和使用还不了解的可以参考我之前写的这篇文章&am…

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

基于java swing和mysql实现的电影票购票管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的电影票购票管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…

PHP小白搭建Kafka环境以及初步使用rdkafka

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装java&#xff08;Kafka必须安装java&#xff0c;因为kafka依赖java核心&#xff09;二、安装以及配置Kafka、zookeeper1.下载Kafka&#xff08;无需下载…