如何跨git提交历史删除敏感数据(API_KEY)?

onV*_*Val 4 git android github gradle

我完成了一个需要我使用 api_key 的 android 项目。我在 build.gradle 文件中添加了 api 密钥,如下所示:

     buildTypes.each {
         it.buildConfigField "String", "MDB_API_KEY", "\"243248324293938243\"" 
     }
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这是一个随机数)

现在我完成了项目,我需要将其上传到 Github,以进行代码审查。在这样做之前,我被要求删除 api 密钥,我做到了

buildTypes.each {
     it.buildConfigField "String", "MDB_API_KEY", *putYaOwnApiKeyBrothar*
         }
Run Code Online (Sandbox Code Playgroud)

并承诺。

但是如果我将所有内容都推送到 Github,他们可以访问任何较旧的提交,并检索我的 api_key。

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

这甚至可能吗?有没有简单的方法?如果没有,我该怎么办?我傻吗?

Vam*_*ire 9

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),请添加'' after sed -i


Eno*_*owa 7

git filter-branch 对我有用:

 git filter-branch --tree-filter "sed -i "" 's/ENTER_API_KEY_TO_REMOVE/STRING_TO_REPLACE_THE_KEY/' filepath"
Run Code Online (Sandbox Code Playgroud)

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

git push --force
Run Code Online (Sandbox Code Playgroud)