解决.git目录过大问题

纸上得来终觉浅,绝知此事要躬行。

Git 是一个分布式版本控制软件,最初由 林纳斯·托瓦兹 创作,于 2005 年发布。最初目的是为更好地管理 Linux 内核开发。Git 在本地磁盘上就保存着所有有关当前项目的历史更新,处理速度快。Git 中的绝大多数操作都只需要访问本地文件和资源,不用实时联网。

  • Git LFS(Large File Storage - ⼤⽂件存储)是可以把⾳乐、图⽚、视频等指定的任意⽂件存在 Git 仓库之外,⽽在 Git 仓库中⽤⼀个占⽤空间 1KB 不到的⽂本指针来代替的⼩⼯具。通过把⼤⽂件存储在 Git 仓库之外,可以减⼩ Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满⼤⽂件⽽损失性能。
  • 使⽤ Git LFS,在默认情况下,只有当前签出的 commit 下的 LFS 对象的当前版本会被下载。此外,我们也可以做配置,只取由 Git LFS 管理的某些特定⽂件的实际内容,⽽对于其他由 Git LFS 管理的⽂件则只保留⽂件指针,从⽽节省带宽,加快克隆仓库的速度;也可以配置⼀次获取⼤⽂件的最近版本,从⽽能⽅便地检查⼤⽂件的近期变动。
解决.git目录过大问题

1. 问题描述

发现问题,然后判断病因!

  • 我们使用过 Git 的同学都知道,随着代码的更新迭代,仓库的体积越来越大。如果操作和使用都比较恰当的情况下,仓库体积不会突增的。但是如果使用不恰当的话,那就非常尴尬了,比如我们下面要说的这种情况,.git 这个隐藏目录特别大。
  • 虽然 .git 这个隐藏目录并不算在代码体积之后,但是我们拉代码的时候,是需要拉下来的,因为里面包含之前的提交记录等信息。这就会导致,原本平和的心情变得焦躁了,因为下载速度变的很慢。
➜  du -d 1 -h
680M    ./.git
500K    ./misc
 68K    ./docker
...
1.1G    .

2. 原因解释

需要对 Git 的工作原理要有一定的理解,才可以明白!

  • 当我们使用 git add 和 git commit 命令的过程中,Git 不知不觉就会帮我们创建出来了 blob 文件对象,然后更新 index 索引,再然后创建 tree 对象,最后创建出了 commit 对象。这些 commit 对象指向了顶层 tree 对象以及先前的 commit 对象。
  • 而上述创建出来的对象,都以文件的方式保存在 .git/objects 目录下。所以,当我们在使用的过程中,提交了一个体积特别大的文件,就会被 Git 追踪记录在 .git/objects 文件夹下面。
  • 此时,如果我们再次删除这个体积特别大的文件,其实 Git 只会记录了我们删除的这个操作,但并不会把文件从 .git 文件夹下面真正的删除,即 .git 文件夹完全不会变小。

3. 解决方法

根本上的解决方式就是,及时使用 lfs 来追踪记录大文件!

  • [方法一] 重建仓库