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 | # 获取前10个大文件 |
1.4. 如果你想查看文件内容
1 | git show 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f |
或者查看文件类型:
1 | git cat-file -t 8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f # 查看对象类型 |
1.5. 查找哪个提交引入了这个大文件
1 | git log --all --find-object=8d8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8b8f8f8f |
2.清理和压缩仓库
执行清理和垃圾回收:
1 | git reflog expire --expire=now --all && git gc --prune=now --aggressive |
3. 推送到远程仓库
如果是远程仓库,需要强制推送:
1 | git push origin --force --all |
预防措施
- 使用
.gitignore
文件忽略不必要的文件 - 对大文件使用Git LFS(Large File Storage)
- 避免直接提交生成的二进制文件