2

以下を使用して、履歴を書き換えようとしています。

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

このチュートリアルで説明されているように。

ただし、私が持っているパスワード文字列には、上記の例の単純な「PASSWORD1」タイプの文字列ではなく、$ ' や \ など、あらゆる種類の非 AZ 文字が含まれています。

誰かが私が必要とするエスケープを説明できますか? 私はこれをどこにも見つけることができず、何時間もこれと戦ってきました.

4

4 に答える 4

3

git filter-branch の代わりに BFG を試してください...

ではなくBFGを使用すると、より使いやすい置換形式を使用できます。次のように、1 行に 1 つのパスワードでファイルを作成します。git-filter-branchpasswords.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 未満) に対して置換が実行されます。一致する文字列 (最新のコミットにないもの) は置換されます。

...エスケープは必要ありません

ここで BFG が置換ファイルを使用して行う解析の唯一のビットは、' ==>' 文字列 (おそらくパスワードには含まれていない) で分割することであり、すべてのテキストはデフォルトで文字どおりに解釈されることに注意してください。

さらに簡潔にしたい場合は==>、各行の ' ' とその後に続くすべてを削除することができます (つまり、単にパスワードのファイルを用意します)。BFG はデフォルトで各パスワードを文字列 ' ***REMOVED***' に置き換えます。

BFG は通常、大きなレポで実行するよりも数百倍高速であり、オプションは次の 2 つの一般的なユースケースに合わせて調整されています。git-filter-branch

  • 非常に大きなファイルを削除する
  • パスワード、資格情報、その他の個人データの削除

完全な開示: 私は BFG Repo-Cleaner の作成者です。

于 2013-09-06T06:11:52.843 に答える
0

ラッパー スクリプトの使用:

#!/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
于 2013-09-05T23:27:28.173 に答える
0

内側から構築します。パスワードは

a$b'c\d

正規表現パターンは次のようになります

a\$b'c\\d

perlコマンドの1つの可能性は

perl -i -pe's/a\$b'\''c\\d/.../g'

'(それぞれが にどのように置き換えられたかに注意してください'\''。)

これを一重引用符で囲む必要があるため、このプロセスを繰り返します。

... '... perl -i -pe'\''s/a\$b'\''\'\'''\''c\\d/.../g'\''' ...
于 2013-09-06T04:50:56.153 に答える