如何查找 git 历史记录中的大文件?


#1

如题。不小心提交了大文件之后,尽管你可以在 HEAD 中把它去掉,可是它还会存在于历史记录中,导致每次同步 git 仓库的时候都会拉很大的文件。如何列出历史记录中这些大文件呢?


#2

下面这个单行的 bash 命令可以做到:

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- \
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

如果你想只列出 top 10, 可以在后面再加上 | tail -n 10

上面的命令会给出一个类似于下面的列表:

...
0d99bb931299  530KiB path/to/some-image.jpg
2ba44098e28f   12MiB path/to/hires-image.png
bd1741ddce0d   63MiB path/to/some-video-1080p.mp4

Mac 用户注意

上面的命令不是很兼容 mac,如果是mac 用户的话,先安装 coreutils:

brew install coreutils

然后使用下面的命令即可:

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

#3

关于如何删除找到的这些大文件可以参考这个帖子