git-filter-branch 删除字符串,但其中字符串包含 $ '\和其他字符

标签 git perl bash git-filter-branch git-rewrite-history

我正在尝试重写历史,使用:

git filter-branch --tree-filter 'git ls-files -z "*.php"|xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx #g"' -- --全部

this tutorial 中所述.

但是,我的密码字符串包含各种非 A-Z 字符,例如$ ' 和\,而不是上面示例中简单的 'PASSWORD1' 类型字符串。

有人可以解释一下我需要什么转义吗?我在任何地方都找不到这个,而且我已经为此奋斗了几个小时。

最佳答案

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

如果您使用 The BFG,则可以使用更加更友好的替换格式。而不是 git-filter-branch 。创建一个 passwords.txt 文件,每行一个密码,如下所示:

PASSWORD1==>xXxXx      # Replace literal string 'PASSWORD1' with 'xXxXx'
ezxcdf\fr$sdd%==>xXxXx # ...all text is matched as a *literal* string by default

然后run the BFG使用此命令:

$ java -jar bfg.jar -fi '*.php' --replace-text passwords.txt  my-repo.git

您的整个存储库历史记录将被扫描,所有 .php 文件(大小低于 1MB)将执行替换:任何匹配的字符串(不在您的最新 commit) 将被替换。

...无需转义

请注意,使用替换文件解析 BFG 的唯一操作是拆分“==>”字符串 - 这可能不是在您的密码中 - 默认情况下所有文本均按字面解释。

如果您想更简洁,您可以删除“==>”以及每行后面的所有内容(即,只有一个密码文件),并且 BFG 默认情况下会将每个密码替换为字符串“***REMOVED***”。

BFG 通常是 hundreds of times faster与在大型存储库上运行 git-filter-branch 相比,这些选项是围绕这两个常见用例定制的:

  • 删除疯狂的大文件
  • 删除密码、凭据及其他私有(private)数据

全面披露:我是 BFG Repo-Cleaner 的作者。

关于git-filter-branch 删除字符串,但其中字符串包含 $ '\和其他字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18647400/

相关文章:

regex - 按扩展名在 git 存储库中搜索文件

perl - 如何为 DBIx 类部署测试数据库

Windows 上的 Git bash - 不支持 sftp

bash - 如何在 bash 中比较两个 tar 文件而不使用临时文件?

linux - 关于 egrep 命令

git - 在 Windows 7 上安装适用于 Git 的 SSH

javascript - 源代码管理中的 Visual Studio 2017 文件

git - 如何使用 token 操作 Bitbucket 存储库?

正则表达式匹配仅有时存在的 `rel` 元素的 `img` 属性

python - 我可以在 Perl 正则表达式中使用命名组来获取哈希结果吗?