有时候历史提交添加过比较大的文件或者敏感文件, 后面也删掉了, 可是git历史记录里面还有, 也会占用空间. 这时候就要用下面的方法来永久删除了.

  1. 运行底层命令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
  1. 使用 rev-list 命令, 查看 blob 对应的文件名
$git rev-list --objects --all | grep 829...3e7
829...3e7 test_file
  1. 确认这个文件不需要的话, 就可以删除了
$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 保证全部被重写.

  1. 删除快取,回收空间
$rm -rf .git/refs/original && git reflog expire --expire=now --all
$git gc --prune=now
  1. 更新到远程服务器
$git push --force