从历史记录中删除包含敏感信息的提交

Removing a commit which contains sensitive information from history

我最近注意到我不小心提交了一个包含敏感信息的 .env 文件。我最好的猜测是,当 Webstorm 询问我是否要将文件添加到 git 时,我不小心单击了确定,因为它是在创建后立即添加到 .gitignore 文件中的。我没有注意到这个文件连续几周被推送到 VCS。我立即 运行 git rm --cached .env 并使用 BFG-Repo Cleaner 从我的版本历史中清除该文件。问题是,虽然 BFG-Repo Cleaner 完成了它的工作(尽管很奇怪,现在每个提交都是重复的),并且该文件不再存在于我的提交历史中的任何地方,但我实际删除文件的提交准确地显示了删除的内容,即密码和密钥。这是 运行 BFG-Repo Cleaner 的通常结果吗?如果是这样,我如何从历史记录中删除该提交而不丢失此后所做的任何提交?我能找到的大多数答案都涉及使用 git reset --hard 恢复到我想删除的那个之前的提交,但我不希望在那之后失去我的工作。

我只是觉得奇怪,一个专为从版本历史记录中删除敏感数据而设计的工具仍然会显示删除敏感数据的提交的 diff

我使用了 BFG-Repo-Cleaner,因为它似乎是 git-filter-branch 的更简单替代品,但是现在这里有使用 git-filter-branch 的用例吗,不是删除文件,而是删除显示我删除的文件内容的提交?

选项 1:如果您将文件作为单独的提交提交。

git rebase -i commit_hash of one less than needed and remove that commit.

假设:这是你的提交历史

commit 5347819473b66359e8324004470040bee0892447 (HEAD -> master)
Author: XXXX
Date:   Wed Dec 13 21:43:29 2017 +0530

    third commit

 blah2.h | 1 +
 1 file changed, 1 insertion(+)

commit d88e9dc5aadfad5872a2cc8214ba5295e2668526
Author: XXXX
Date:   Wed Dec 13 21:42:56 2017 +0530

    second commit

 blah1.h | 1 +
 1 file changed, 1 insertion(+)

commit 2419b28fee57a6923ce37e2e144c12d88fb75183
Author: XXXX
Date:   Wed Dec 13 21:42:33 2017 +0530

    first commit

 blah.h | 1 +
 1 file changed, 1 insertion(+)

并且您想删除第二次提交。

git rebase -i 2419b28fee57a6923ce37e2e144c12d88fb75183 - Commit hash of first commit. And then interactively remove the line containing the second commit and save. 

选项 2:如果您还提交了包含其他更改的文件,那么

git reset commit_hash of one less than needed. 

将该文件添加到 git 忽略并将所有更改提交为新提交。在这种情况下,您将丢失从提交该文件到现在的项目历史记录。