永久删除Git仓库中的大文件

  • Kevin
  • 3 Minutes
  • 2017年9月7日

有时候,手一抖就把一个几十M甚至上百M的文件提交到了git仓库中,这下整个人都不好了有木有。因为这个大文件直接是删不掉的,它会一直占用着你的项目空间大小,直到你实在受不了最后删库。以后每次首次拉取和推送项目的时候都是一个漫长的等待过程,我就是有过这样的经历才决定写这样的一篇文章,留着备用。

那么如何在不破坏git仓库的前提下完美删除没用的大文件

一、找到项目中的大文件

1
2
3
4
# 查看项目空间占用情况(只是查看,可以不运行)
$ git count-objects -v
# 对文件进行排序,并列出前5大文件(根据自己的需求来)
$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

如果运行报错,则先运行git gc命令,再运行上面的命令。成功之后会列出文件的hash值以及大小,然后根据hash值来确定文件的名称:

1
2
# 根据文件的hash值过滤
$ git rev-list --objects --all | grep 8f10e

二、删除找到的大文件

1
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>'

之后复制以下的命令一步一步执行:

1
2
3
4
5
6
7
8
9
$ rm -rf .git/refs/original/

$ git reflog expire --expire=now --all

$ git fsck --full --unreachable

$ git repack -A -d

$ git gc --aggressive --prune=now

我也不知道每一条具体有什么用,反正一步一步执行就对了。

三、强制推送到远程仓库

1
$ git push --force [remote] [branch-name]

这下整个世界终于清静了!