我试图改写历史,用:
git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx#g"' -- --all
如本教程所述。
但是,我拥有的密码字符串包含各种非all字符,例如$‘和\,而不是上面示例中简单的'PASSWORD1’类型字符串。
,有人能解释我需要什么逃跑吗?,我在任何地方都找不到这个,我已经和这个斗争了好几个小时了。
发布于 2013-09-06 06:11:52
试试BFG而不是git过滤器分支.
如果使用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然后使用以下命令进行运行BFG:
$ java -jar bfg.jar -fi '*.php' --replace-text passwords.txt my-repo.git您的整个存储库历史记录将被扫描,所有.php文件(小于1MB的大小)都将执行替换:任何匹配的字符串(在最近的提交中没有)都将被替换。
需要...no转义
请注意,BFG对替换文件进行解析的唯一方法是拆分“==>”字符串(它可能不在密码中),默认情况下所有文本都按字面解释。
如果您想要更简洁,您可以删除“==>”和每一行后面的所有内容(即,只需要一个密码文件),默认情况下,BFG将用字符串'***REMOVED***‘替换每个密码。
BFG通常是比以前快几百倍,而不是在大型回购上运行git-filter-branch,这些选项是围绕这两个常见的用例定制的:
完全披露:我是BFG回购清洁的作者。
发布于 2013-09-07 10:12:16
在康索尔盒提供的出色帮助的基础上--它确实帮助我解决了这个问题,我最终使用的解决方案是:
在文件strings.txt中定义字符串
string1
another$string
yet! @nother string
some more stuff to re\move创建一个Perl脚本perl-escape-strings.pl,它将用于转义字符串,其中xXxXxXxXxXx是所有字符串都将被替换的字符串。
#!/usr/bin/perl
use strict;
use warnings;
while (<>)
{
chomp;
my $passwd = quotemeta($_);
print qq|s/$passwd/xXxXxXxXxXx/g;\n|;
}
exit 0;Bash脚本:
# Pre-process the strings
./perl-escape-strings.pl strings.txt > strings-perl-escaped.txt
# Change directory to the repo
cd repo/
# Define the filter command
FILTER="git ls-files -z '*.html' '*.php' | xargs -0 perl -p -i ../strings-perl-escaped.txt"
# Run the filter
git filter-branch --tree-filter "$FILTER" -- --all但是,由于字符串的数量很大,而且我的存储库很大,并且有数千次提交,所以过滤器分支方法花费了很长时间。因此,我将尝试另一个答案中提到的BFG,看看它是否完成得更快。
发布于 2013-09-05 23:27:28
使用包装脚本:
#!/bin/bash
readarray -t PASSWORDS < list_file
REPLACEMENT='xXxXxXxXxXx'
SEP=$'\xFF'
EXPR=${PASSWORDS[0]}
for (( I = 1; I < ${#PASSWORDS[@]}; ++I )); do
EXPR+="|${PASSWORDS[I]}"
done
EXPR="s${SEP}(${EXPR})${SEP}$REPLACEMENT${SEP}g"
EXPR=${EXPR//'\'/'\\\\'}; EXPR=${EXPR//'$'/'\\\$'}
EXPR=${EXPR//'"'/'\"'}; EXPR=${EXPR//'`','\`'}
EXPR=${EXPR//'^','\\^'}; EXPR=${EXPR//'[','\\['}
EXPR=${EXPR//']','\\]'}; EXPR=${EXPR//'+','\\+'}
EXPR=${EXPR//'?','\\?'}; EXPR=${EXPR//'.','\\.'}
EXPR=${EXPR//'*','\\*'}; EXPR=${EXPR//'{','\\{'}
EXPR=${EXPR//'}','\\}'}; EXPR=${EXPR//'(','\\('}
EXPR=${EXPR//')','\\)'}
FILTER="git ls-files -z '*.php' | xargs -0 perl -p -i -e \"$EXPR\""
echo "Number of passwords: ${#PASSWORDS[@]}"
echo "Passwords:" "${PASSWORDS[@]}"
echo "EXPR: $EXPR"
echo "FILTER: $FILTER"
git filter-branch --tree-filter "$FILTER" -- --allhttps://stackoverflow.com/questions/18647400
复制相似问题