清除git里的敏感信息,个人密码
之前的爬虫里面加了个发送邮件提示,绑了自己的个人邮箱和密码,传到git好久才发现这个问题,但是如果手动删掉再发一个新的commit,历史版本里仍然还会有这些信息,所以想要一个办法清除所有commit里面的信息。
搜索了一下发现了一个工具。
BFG Repo-Cleaner
BFG Repo-Cleaner是一个专门用来清除git库里bad data的工具。
主要有两个功能
- Removing Crazy Big Files //删掉某些文件
- Removing Passwords, Credentials & other Private data //删除敏感信息
使用前注意本机需要安装java.
此外在执行之前先要提到一个我自己遇到的问题
来自pull request的commit是不能被修改的
因为通过pull得到的commit是只读的:
The refs beginning 'refs/pull' are synthetic read-only refs created by GitHub - you can't update (and therefore 'clean') them, because they reflect branches that may well actually come from other repositories - ones that submitted pull-requests to you.
如过你没有这个问题,那么我们继续方法如下:
- 先到BFG主页点击页面右侧的下载按钮下载BFG的
.jar
文件. - 为了方便起见创建一个新文件夹,把刚刚下载的.jar复制进去.
如果你是为了删除个人密码之类的信息,则在同一个文件夹下建立txt文件,每一行输入一个你要删除的敏感信息 - 打开git bash, 跳转到刚刚新建的文件夹,注意,语法为
cd /c/project/
- 复制你想要修改的库,键入:
$ git clone --mirror https://github.com/user/repo.git
注意,这里若使用的是类似$ git clone --mirror git://example.com/some-big-repo.git
的格式,在最后push的时候也会出现权限问题,因为也是只读的.
参考1, 参考2
The problem is that URL like git://github.com/user/repo.git is read-only, SSH URL like git@github.com:user/repo.git and HTTPS URL like https://github.com/user/repo.git are writeable.
- 接下来使用BFG删除txt文件里列出的敏感信息:
$ java -jar bfg.jar --replace-text password.txt my_repo
到这一步的时候所有的历史记录就应该被更新了 - 之后请进执行这段我也不知道是干什么但貌似是物理上清理掉刚刚被在记录里更新掉但其实仍然可见的敏感信息的代码
$ cd my_repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
- 最后,
$ git push
,如果此处遇到了fatal: remote error:
,则是上面提到的在复制时出现的问题,请执行$ git remote set-url origin <在这里改成HTTP开头的URL>
来解决.
注意,如果你跟我一样,repo里包含来自pull request的commit,那这些commit会被denied掉:
! [remote rejected] refs#11/head -> refs#11/head (deny updating a hidden ref)
目前没找到解决办法,删库重建吧 TAT