Git如何永久删除历史文件

通过以下命令,就可以永久删除你想要删除的任何文件:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all

将path-to-your-remove-file替换为删除文件的相对路径,并执行。如果有以下执行反馈,说明删除成功了

Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
Ref 'refs/tags/0.1' was rewritten
Ref 'refs/tags/v0.2' was rewritten

如果所有分支都是unchanged说明要么是该分支没有要删除的文件,要么是删除文件的路径不对。

此时你会发现本地目录中的.git文件并不会马上就变小,而是与原来是一样的,
是因为Git仓库历史有个缓存期,如果不主动回收、清理仓库历史,一般的这些记录还会保存一段时间,以备你突然后悔了,没办法找回删掉的文件。
通过以下命令主动回收资源:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

执行以上命令,就会发现.git目录变小了。那么接下来只要把本地的记录,强制更新到远程仓库就行了。

git push origin --force --all
git push origin --force --tags
# 查看历史大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"