清理 Git 仓库中残留的大文件

by CUNOE, October 5, 2023

今天克隆仓库的时候发现虽然将图片和一些文件的存储丢到了 Cloudflare R2 上去,但是仓库的大小还是占用到了 182MB ,为了方便仓库的克隆和不必要的存储,于是开始清理相关内容。

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
# 如果提示 zsh: command not found: numfmt 请先安装 coreutils
brew install coreutils

files need clean

可以看到有很多文件还存在而并没有被清理,故执行下面的命令来清理。(要注意将source/img/*.*替换成你自己的地址。

git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch content/img/*.*' --tag-name-filter cat -- --all
git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch content/files/*.*' --tag-name-filter cat -- --all

回收 git 的存储空间并强制推送到远程仓库

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git repack -A -d
git gc --aggressive --prune=now
git push --force

此时需要重新clone仓库即可看到优化后的效果。

我这个仓库从 182MB -》 219KB,可以说很不错(