有时候历史提交添加过比较大的文件或者敏感文件, 后面也删掉了, 可是git历史记录里面还有, 也会占用空间.
这时候就要用下面的方法来永久删除了.
- 运行底层命令
git verify-pack
以识别出大对象, 对输出的第三列信息即文件大小进行排序
$git verify-pack -v .git/objects/pack/pack-6d6...b0b.idx -v | sort -n -k 3 | tail -5
034...2c4 blob 8943 3472 21832
ec2...08b blob 11117 3081 29005
270...9e8 blob 12687 4841 14122
d57...91a blob 17888 5654 41757
829...3e7 blob 25644 5743 65787
或者直接看全部idx文件
$git verify-pack .git/objects/pack/pack-* -v | sort -n -k 3 | tail -10 | uniq
- 使用
rev-list
命令, 查看blob
对应的文件名
$git rev-list --objects --all | grep 829...3e7
829...3e7 test_file
- 确认这个文件不需要的话, 就可以删除了
$git filter-branch --force --index-filter "git rm -rf --cached --ignore-unmatch test_file" --prune-empty --tag-name-filter cat -- --all
使用--tag-name-filter cat
更新 tag.
使用--all
保证全部被重写.
- 删除快取,回收空间
$rm -rf .git/refs/original && git reflog expire --expire=now --all
$git gc --prune=now
- 更新到远程服务器
$git push --force