如何在Git提交历史记录中删除敏感数据(API_KEY)?

10

我完成了一个需要使用api_key的安卓项目。 我已经像这样在我的build.gradle文件中添加了api key:

     buildTypes.each {
         it.buildConfigField "String", "MDB_API_KEY", "\"243248324293938243\"" 
     }

(这是一个随机数)

现在我已经完成了项目,需要将其上传到Github进行代码审核。在此之前,我被要求删除API密钥,并且我已经执行了此操作。

buildTypes.each {
     it.buildConfigField "String", "MDB_API_KEY", *putYaOwnApiKeyBrothar*
         }

并且保证提交。

但是,如果我把所有东西都推到Github上,他们可以访问任何旧的提交,并检索我的api_key。

我看过类似的问题,解决方案似乎是git filter-branch,但它似乎会在提交历史记录中删除特定的文件。 我想只删除密钥(或该行),因为我希望*putYaOwnApiKeyBrothar*代码在所有提交中都可用。(以防他们必须检查旧的提交)。

这是否可能? 有简单的方法吗? 如果没有,我该怎么办? 我是不是很愚蠢?


3
你应该作废当前的API密钥并获取新的密钥,同时保持原意不变并使句子更加通俗易懂。 - Thilo
通过rebasing和编辑您推送API密钥的旧提交,应该可以实现。我猜那应该是一个您已经推送了API密钥的单个提交? - Deepesh
我还没有将任何东西推送到Github(或任何其他服务器)。我在最初的提交之一中设置了api_key,并且它传播到了我所有的提交(超过50个)。此外,我对git不是很有经验,所以我不知道如何使用rebase来做到这一点。唯一没有api_key的提交是最后一个(和前两个,我想)。 - ovalb
4个回答

14

git filter-branch 是一个好的选择。它有各种不同的过滤器,可以从历史记录中删除文件,但也可以自由修改文件。在您的情况下,您需要使用 --tree-filter 选项,并使用命令替换文件中的字符串。例如:git filter-branch --tree-filter "sed -i 's/243248324293938243/putYaOwnApiKeyBrothar/' your/file/here" --tag-name-filter cat --all

(如果您正在使用 macOS(或任何 *BSD),请在 sed -i 后面添加 '' )


我尝试了你说的方法,但是命令似乎并没有真正起作用。我修改了你的sed命令为sed -i'' 's/blabla...(添加空-i参数),因为我使用的是BSD版本的sed(运行在OS X上),但仍然不起作用。当我运行你的命令并将其替换为我的API密钥以及app/gradle.build文件(甚至尝试了绝对路径),终端进入了“dquote”模式。我对git不太熟悉,所以我有点难以理解如何正确使用git filter-branch。 - ovalb
1
好的,我成功让它工作了!感谢你的建议!命令是:git filter-branch --tree-filter "sed -i "" 's/243248324293938243/putYaOwnApiKeyBrothar/' app/build.gradle" HEAD。(如果你在Linux上,-i后面的""可能不需要) - ovalb
在执行此命令后,我该如何推送这些更改? - camiblanch
你必须强制推送,任何已经拉取旧历史记录的人都必须按照“如何从上游重置中恢复”的描述手动变基,否则她可能会重新引入旧历史记录。 - Vampire
@camiblanch 请尝试使用 git push origin --force --all - Nuhman

6

git filter-branch 对我很有用:

 git filter-branch --tree-filter "sed -i "" 's/ENTER_API_KEY_TO_REMOVE/STRING_TO_REPLACE_THE_KEY/' filepath"

文件路径应包含文件名,例如/src/main/Application.java,其中存储了先前存储的密钥信息。当您尝试将这些更改推送到GitHub时,它们可能会被拒绝,在这种情况下,请使用:
git push --force

2

Git提醒我要避免使用filter-branch,并建议使用git-filter-repo代替。我安装了它,并按照这里找到的说明进行操作。我花了5分钟就掌握了它,感觉非常简单和直观。

也许最重要的是,git-filter-repo不接受内联搜索替换语句。您需要创建自己的文件,其中应包含您想要进行的替换(文档)。


0
如果您遇到以下情况:
1. 提交历史不复杂,例如您在一个提交中添加了敏感数据,并将其推送到一个功能分支,然后在代码审查过程中有人发现了敏感内容。
并且
2. 您的提交没有包含很多更改(理想情况下不应该有)。
那么您可以:
1. 备份已更改的文件。 2. 删除该提交(参考如何从远程分支永久删除几个提交以获取一些想法)。 3. 从备份中复制粘贴您的提交更改,除了敏感内容。 4. 运行git push --force命令。
我采用这种方法是因为filter-branch向我显示了警告,并要求我使用git-filter-repo。而我所遵循的博客也警告说,如果不正确使用,这个脚本可能会造成损害。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接