git(3)查找大文件及清理压缩缩容仓库

随着时间推移,Git仓库可能会变得臃肿,特别是当有大文件被提交后又删除。清理大文件、瘦身.git。

1. 识别大对象

1.1.首先获取大对象的SHA-1哈希值

假设你运行了:

1
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5

输出可能类似于:

8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f blob   104857600 57 123456
...

第一列就是对象的SHA-1哈希值。

1.2. 使用以下命令查看具体文件

对于每个SHA-1值,运行:

1
git rev-list --objects --all | grep 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f

这会显示该对象对应的文件路径。

1/2命令简化:

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{system(" git rev-list --objects --all | grep "$1" ")}'

1.3. 更直观的方法(一次性查看所有大文件)

1
2
3
4
5
6
# 获取前10个大文件
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print $3, $4}' \
| sort -k1 -n \
| tail -10

1.4. 如果你想查看文件内容

1
git show 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f

或者查看文件类型:

1
2
git cat-file -t 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f  # 查看对象类型
git cat-file -p 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f | head -n 10 # 查看前10行内容

1.5. 查找哪个提交引入了这个大文件

1
git log --all --find-object=8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f

2.清理和压缩仓库

执行清理和垃圾回收:

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

3. 推送到远程仓库

如果是远程仓库,需要强制推送:

1
2
git push origin --force --all
git push origin --force --tags

预防措施

  1. 使用.gitignore文件忽略不必要的文件
  2. 对大文件使用Git LFS(Large File Storage)
  3. 避免直接提交生成的二进制文件