首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于删除字符串的git-filter分支,但其中字符串包含$‘\和其他字符

用于删除字符串的git-filter分支,但其中字符串包含$‘\和其他字符
EN

Stack Overflow用户
提问于 2013-09-05 23:14:00
回答 4查看 1.7K关注 0票数 2

我试图改写历史,用:

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’类型字符串。

,有人能解释我需要什么逃跑吗?,我在任何地方都找不到这个,我已经和这个斗争了好几个小时了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-06 06:11:52

试试BFG而不是git过滤器分支.

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

代码语言:javascript
复制
PASSWORD1==>xXxXx      # Replace literal string 'PASSWORD1' with 'xXxXx'
ezxcdf\fr$sdd%==>xXxXx # ...all text is matched as a *literal* string by default

然后使用以下命令进行运行BFG

代码语言:javascript
复制
$ java -jar bfg.jar -fi '*.php' --replace-text passwords.txt  my-repo.git

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

需要...no转义

请注意,BFG对替换文件进行解析的唯一方法是拆分“==>”字符串(它可能不在密码中),默认情况下所有文本都按字面解释。

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

BFG通常是比以前快几百倍,而不是在大型回购上运行git-filter-branch,这些选项是围绕这两个常见的用例定制的:

  • 删除疯狂大文件
  • 删除密码、凭据和其他专用数据

完全披露:我是BFG回购清洁的作者。

票数 3
EN

Stack Overflow用户

发布于 2013-09-07 10:12:16

康索尔盒提供的出色帮助的基础上--它确实帮助我解决了这个问题,我最终使用的解决方案是:

在文件strings.txt中定义字符串

代码语言:javascript
复制
string1
another$string
yet! @nother string
some more stuff to re\move

创建一个Perl脚本perl-escape-strings.pl,它将用于转义字符串,其中xXxXxXxXxXx是所有字符串都将被替换的字符串。

代码语言:javascript
复制
#!/usr/bin/perl

use strict;
use warnings;

while (<>)
{
        chomp;
        my $passwd = quotemeta($_);
        print qq|s/$passwd/xXxXxXxXxXx/g;\n|;
}

exit 0;

Bash脚本:

代码语言:javascript
复制
# 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,看看它是否完成得更快。

票数 1
EN

Stack Overflow用户

发布于 2013-09-05 23:27:28

使用包装脚本:

代码语言:javascript
复制
#!/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" -- --all
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18647400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档