安全圈 | 专注于最新网络信息安全讯息新闻

首页

教你如何去掉git历史中的敏感信息

作者 voelkl 时间 2020-02-27
all

本文作者:0x584A(来自信安之路作者团队) 赠送书籍:《Linux系统安全》 活动地址:信安之路五月送书活动 本章教大家如何使用 GIT 进行一些关于已提交历史的修改、删除操作。比如碰到下列情况时,如何使用 GIT 实现想要的操作:

GIT GIT

1、代码或日志中的注释误提交了,怎么修改它? 2、我想丢弃指定的提交历史可不可以? 3、在提交很久历史记录中存在敏感信息,如何修改或删除它? 阅读本文章时默认大家都具备使用 GIT 进行基本操作的水平。

GIT

提交至远程前的修复操作 可以看到,这里有一个新文件等待添加提交,我们现在来将文件加入索引缓存中并构建索引树: 因为输入描述有误,原本应该是 测试上传一个文件,因为少打了一个字此时的 log 描述就变成了:

测试上传一个文件 log

这时候我们可以用 $ git commit --amend 命令来修改最近一次的提交描述。我这里用的为 VIM ,所以补上缺失的字后 :wd 保存退出即可。

$ git commit --amend VIM :wd

再通过 $ git log 查看本地历史:

$ git log

此时已经将文字补全,最后执行 push 推送至远程服务器即可。

push

移除指定的提交历史 比如,刚修复了一条的测试反馈的错误,最终定位到并不是代码问题只需要重启下服务就可以了,但改过的代码已经进入了 GIT ,此时重新进行 add -> commit -> push 提交有可以。

GIT add -> commit -> push

只是会在 log 中产生一条垃圾记录,如果后期会查看 log 进行一些 diff 时,看到这段改动会很懵逼。

log log diff

现在我们在刚才的基础上增加了一次提交,存在了一个 test2.txt 文件。 先通过 $ git log 命令在历史记录中查找到想要删除的某次提交的 commit id,我这里是:5e63d3cfa09176422b0b52714bd77af1a0ce8e63。

$ git log commit id 5e63d3cfa09176422b0b52714bd77af1a0ce8e63

执行: $ git rebase -i "5e63d3cfa09176422b0b52714bd77af1a0ce8e63"^(注意,这个 ^ 符号一定要带后面)。

$ git rebase -i "5e63d3cfa09176422b0b52714bd77af1a0ce8e63"^ ^

此时会进入一个 VIM 编辑:

VIM

删除第一行内容 :wq 保存并退出,再用 log 看看记录,测试已经不存在 测试上传一个文件 的操作及文件 test.txt 了。

:wq log 测试上传一个文件 test.txt

最后通过 $ git push origin master -f 指令,将本地对应修改后的分支推送至远端强制覆盖。

$ git push origin master -f

改写已提交的历史记录 当我们根据关键词 log 搜索提交历史存在敏感信息,是很久以前提交的并且那次提交改动了很多文件的内容,不能通过移除 commit id 的方式进行删除,此时该怎么办呢?

log commit id 

核弹级选项: filter-branch 官方文档上的实例:要从整个历史中删除一个名叫 password.txt 的文件,你可以在 filter-branch 上使用 --tree-filter 选项 : $ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD 所以这里我们需要替换成 $ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch passwords.txt' --prune-empty --tag-name-filter cat -- --all

$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch passwords.txt' --prune-empty --tag-name-filter cat -- --all

passwords.txt 替换成实际要删除的文件或相对目录即可。 如图中所示,已经没有 userpasswod.ini 的记录,关键字也搜索不到了,最后将修改后的分支推送至远端强制覆盖即可

userpasswod.ini