git repo 永久删除大文件

有时候我们可能会因为.gitignore等原因误添加了一些文件
删除之后会因为之前commit过导致占用git仓库的空间, 这样非常浪费,尤其是对于那些自建git且有不好的commit习惯的用户

那怎么删除呢?
可以借助git的filter-branch(小心使用,因为操作不当可能导致重要记录丢失)

  1. 首先查看哪些文件最占用git仓库
    1
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

  rev-list命令用来列出Git仓库中的提交,我们用它来列出所有提交中涉及的文件名及其ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。
  –objects:列出该提交涉及的所有文件ID。
  –all:所有分支的提交,相当于指定了位于/refs下的所有引用。
  verify-pack命令用于显示已打包的内容。

  1. 删除历史提交文件
    1
    git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch filename' --prune-empty --tag-name-filter cat -- --all

把filename改成你想删除的即可

  1. 推送repo
    1
    git push origin master --force

此时remote repo已经被清理了,但是本地的repo多余的文件还没被清理

  1. 清理本地repo
    1
    2
    3
    rm -rf .git/refs/original/
    git reflog expire --expire=now --all
    git gc --prune=now

参考: 记一次删除Git记录中的大文件的过程