关于后端:git文件夹内容详解

3次阅读

共计 3199 个字符,预计需要花费 8 分钟才能阅读完成。

.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目录的大小

etcd:

rust:

可见在 .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 目录,但能够应用上述办法来治理和减小它的大小。

在一个 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 值来援用和拜访。

.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 的性能。

.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 对象的访问速度。

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

能够用 git cat-file -t 查看每个 SHA-1 的类型,用 git cat-file -p 查看每个对象的内容和简略的数据结构。git cat-file 是 git 的瑞士军刀,是底层外围命令


git 原理:pack 打包

Git 仓库拆分

Git 外部原理

删除 Git 仓库中的大文件


本文由 mdnice 多平台公布

正文完
 0