如何在Git历史中替换单词并正确调试相关问题?

Mar*_*arc 3 regex git replace sed git-filter-branch

我正在尝试从Git历史记录中删除密码等敏感数据.我没有删除整个文件,而只想用密码代替removedSensitiveInfo.这是我在浏览了大量StackOverflow主题和其他网站后想出的.

git filter-branch --tree-filter "find . -type f -exec sed -Ei '' -e 's/(aSecretPassword1|aSecretPassword2|aSecretPassword3)/removedSensitiveInfo/g' {} \;"
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,它似乎正在重写历史记录(它显示了它重写的提交并需要几分钟).但是,当我检查是否确实已删除所有敏感数据时,它仍然存在.

作为参考,这是我如何进行检查

git grep aSecretPassword1 $(git rev-list --all)
Run Code Online (Sandbox Code Playgroud)

这向我展示了与搜索查询匹配的数百个提交.什么都没有被取代.

知道这里发生了什么吗?

我仔细检查了我正在使用的正则表达式,这似乎是正确的.我不知道还有什么可以检查或如何正确调试这个我的Git知识相当简陋.例如,我不知道如何测试1)我的正则表达式是否匹配任何东西,2)sed没有在所有文件上运行,3)文件更改没有被保存,或者4)其他东西.

很感谢任何形式的帮助.

PS我知道有关此主题的几个StackOverflow线程.但是,我找不到一个关于替换所有(ASCII)文件中的单词(而不是删除文件)(而不是指定特定文件或文件类型).不确定这是否应该有所作为,但所有建议的解决方案都不适用于我.

Rob*_*ley 10

git-filter-branch是一个功能强大但难以使用的工具 - 有一些模糊的东西需要知道才能正确地用于你的任务,每一个都是你所看到的问题的可能原因.因此,不要立即尝试调试它们,让我们退一步看看原始问题:

  • 在所有文本文件中替换给定的字符串(即密码)(不指定特定的文件/文件类型)
  • 确保更新的Git的历史并没有包含旧密码文本
  • 尽可能简单地完成上述操作

这个问题有一个量身定制的解决方案:

使用BFG ...而不是git-filter-branch

BFG回购清洁是一个简单的替代git-filter-branch 专门从Git仓库历史记录中删除密码和其他不需要的数据.

BFG在这种情况下帮助您的方式:

  • BFG的速度提高了 10-720
  • 它会自动在所有标记和引用上运行,不像 git-filter-branch - 只有在添加了非常的--tag-name-filter cat -- --all命令行选项时才会这样做(请注意,您在问题中给出的示例命令没有这个,可能是您的问题的原因)
  • BFG 不会生成任何refs/original/引用 - 因此您无需执行额外的步骤来删除它们
  • 您可以将密码表示为简单的文字字符串,而无需担心正确的regex转义.如果你真的需要它,BFG也可以处理正则表达式.

使用BFG

仔细按照使用步骤 - 核心位只是这个命令:

$ java -jar bfg.jar  --replace-text replacements.txt  my-repo.git
Run Code Online (Sandbox Code Playgroud)

replacements.txt文件应包含您要执行的所有替换,格式如下(每行一个条目 - 请注意不应包含注释):

PASSWORD1 # Replace literal string 'PASSWORD1' with '***REMOVED***' (default)
PASSWORD2==>examplePass         # replace with 'examplePass' instead
PASSWORD3==>                    # replace with the empty string
regex:password=\w+==>password=  # Replace, using a regex
Run Code Online (Sandbox Code Playgroud)

将扫描您的整个存储库历史记录,并且所有文本文件(大小不超过1MB)将执行替换:将替换任何匹配的字符串(不在您的最新提交中).

完全披露:我是BFG Repo-Cleaner的作者.

  • 很好 - 效果很好......而且,我从来没有看到过运行它时打印出政治信息的OSS项目. (2认同)