我正在尝试重写历史,使用:
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/