有时候总是会不小心把存有账号密码之类的敏感文件push到github上。如果这次commit只有这一个文件,并且发现的及时,那还是很好解决的,删除commit然后强推就可以了。

但是不幸的是,总有那么些时候发现的比较晚,并且那次commit中含有其他的文件。

方法1:

试试BFG这个工具吧。
http://rtyley.github.io/bfg-repo-cleaner/

方法2:

使用git filter-branch命令处理。

step 1

clone项目回来。

step 2

执行以下命令:

$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

记得把其中的PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA替换成实际包含敏感信息的文件。

step 3

这个时候该文件其实已经删掉了,但是为了以防万一,现在你可以把它加到.gitignore文件中。或是做一些其他的必要操作。

step 4

强推回去:

$ git push origin --force --all

记得把tag也强推一遍,如果没有打过tag,可以不用。

$ git push origin --force --tags

step 5

检查一下有没有出现其他的问题,例如少文件,文件内容不对等。没有的话就可以做最后的操作了:

$ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
$ git reflog expire --expire=now --all
$ git gc --prune=now

PS

如果有其他人和你一起维护这个项目,那么应该让他们用rebase来获取最新的内容,千万不要使用merge,不然历史记录中还会出现那些敏感信息的,因为他们的本地log中还存在这些内容,merge的话会重新推上去。

参考资料:https://help.github.com/articles/remove-sensitive-data/