Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save condorheroblog/f8975d93a7de12bf4e342a1a51781f9e to your computer and use it in GitHub Desktop.
Save condorheroblog/f8975d93a7de12bf4e342a1a51781f9e to your computer and use it in GitHub Desktop.

如何删除 Git 历史里的大文件

1. 找出大文件

通过下面命令可以得到已经排序的文件大小:

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  sed -n 's/^blob //p' |
  sort --numeric-sort --key=2 |
  cut -c 1-12,41- |
  $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

Mac 系统没有 numfmt,要么自己安装,要么删除上面命令最后一行。

来源:how-to-find-identify-large-commits-in-git-history

2. 删除文件

  • 需要 Java8 以上的运行环境(JRE),下载安装 java JRE
  • 备份好仓库,然后通过 --mirror clone 你的仓库,例如 git clone --mirror git://example.com/some-big-repo.git
  • 下载 bfg-repo-cleaner然后把文件移动到仓库中

接下来我要删除 node_modules.zip 文件:

java -jar bfg-1.14.0.jar -D "node_modules.zip"

等待命令执行完成,按照提示输入:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

推送

git push

然后通知其他人,删除本地仓库,重新拉取。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment