Git删除误add的文件

背景

很多时候,我们经常会不小心把一个不应该add进来的文件 add到 Repo里了。比如:

password.txt,.log .mp4 等等。

解决办法

这种情况下,我们可以选择用 git filter-branch 来将历史的所有commit都重新过滤一下。

查看Git的文档得知,filter-branch是一个核弹级操作:

如果你想用脚本的方式修改大量的提交,还有一个重写历史的选项可以用——例如,全局性地修改电子邮件地址或者将一个文件从所有提交中删除。
这个命令是filter-branch,这个会大面积地修改你的历史,所以你很有可能不该去用它,除非你的项目尚未公开,没有其他人在你准备修改的提交的基础上工作。
尽管如此,这个可以非常有用。你会学习一些常见用法,借此对它的能力有所认识。

从所有提交中删除一个文件
这个经常发生。有些人不经思考使用git add .,意外地提交了一个巨大的二进制文件,你想将它从所有地方删除。
也许你不小心提交了一个包含密码的文件,而你想让你的项目开源。filter-branch大概会是你用来清理整个历史的工具。
要从整个历史中删除一个名叫password.txt的文件,你可以在filter-branch上使用–tree-filter选项

Example:把历史中不小心添加进来的所有mp4文件清除。

1
2
3
4
5
6
7
8
删除所有后缀为mp4 的历史提交文件
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch *.mp4' --prune-empty -f
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all && git gc --aggressive --prune=now
如果要push到remote Repo的话,需要加-f 强推