Git仓库大文件清理指南
前言
当大文件被提交到 Git 仓库后又删除,但仓库体积仍然很大时,这是因为 Git 保留了这些文件的历史记录。要彻底清理这些文件并减小仓库体积,你需要重写 Git 历史。
注意事项
-
这会重写历史 - 所有协作者都需要重新克隆仓库
-
备份你的仓库 - 操作前先备份
-
通知团队成员 - 因为需要强制推送,会影响所有使用者
-
后续提交 - 确保不再提交大文件,考虑添加
.gitignore
规则
使用 git filter-branch
接下来我们使用git filter-branch从Git的整个历史记录中彻底删除某个文件,如下图,在我的gitee中有上传了一些模型文件,占用了大量的内存。
然后我们打开终端,执行游戏git命令,看看是否还有其他大文件。
此命令会显示前10个大文件,并显示文件大小,如 100MB data/large-file.zip
git rev-list --objects --all \| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \| awk '/^blob/ {print $3, $4}' \| sort -n -k1 \| tail -10 \| numfmt --field=1 --to=iec --suffix=B
因为我的是macOS,numfmt
命令在 macOS 上默认不可用,我的命令是用 awk 转换单位。
git rev-list --objects --all \| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \| awk '/^blob/ {print $3, $4}' \| sort -n -k1 \| tail -10 \| awk '{size = $1;if (size >= 1024*1024*1024) printf "%.2fGB %s\n", size/(1024*1024*1024), $2;else if (size >= 1024*1024) printf "%.2fMB %s\n", size/(1024*1024), $2;else if (size >= 1024) printf "%.2fKB %s\n", size/1024, $2;else printf "%dB %s\n", size, $2;}'
从输出情况来看,只有我想删除的文件有超过10MB,因此我可以直接使用限制大小来删除文件。
# 删除所有超过 10M 的文件
git filter-branch --tree-filter 'find . -size +10M -type f -delete' --prune-empty HEAD
然后gie会遍历你所有的历史提交,命令执行完成后接着执行以下命令
# 清理
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now# 强制推送
git push origin --force --all
git push origin --force --tags
预防措施
为避免将来出现此问题:
-
使用
git-lfs
(Git Large File Storage) 管理大文件 -
设置预提交钩子检查文件大小
-
在
.gitignore
中添加不应跟踪的文件模式