记录一下Git怎么永久删除文件(包括该文件的历史记录)。
bfg-repo-cleaner
最快速方便的操作可以使用bfg-repo-cleaner工具操作,具体操作如下:
1 | wget https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar |
bfg-repo-cleaner不会删除真实存在的文件。如果想手动执行可以参考以下的方式。
查看哪些历史提交过文件占用空间较大
使用以下命令可以查看占用空间最多的五个文件:
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。 该命令可以指定只显示某个引用(或分支)的上下游的提交。
1 | --objects:列出该提交涉及的所有文件ID。 |
重写commit,删除大文件
使用以下命令,删除历史提交过的大文件:
1 | git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.zip' --prune-empty --tag-name-filter cat -- --all |
上面脚本中的big-file.zip请换成你第一步查出的大文件名,或者这里直接写一个目录。操作后注意看一下是否有删除真实存在的文件。
1 | filter-branch命令可以用来重写Git仓库中的提交 |
在重写提交的过程中,会有以下日志输出:
1 | Rewrite 6cdbb293d453ced07e6a07e0aa6e580e6a5538f4 (266/266) |
如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确,重复上面的脚本,把所有你想删除的文件都删掉。
清理和回收空间
虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间,命令如下:
1 | cd 仓库目录 |
推送修改后的repo
以强制覆盖的方式推送你的repo, 命令如下:
1 | #git push origin master --force |