Git 履歴全体の文字列を置き換えるにはどうすればいいですか? 質問する

Git 履歴全体の文字列を置き換えるにはどうすればいいですか? 質問する

Git リポジトリ内のおそらくいくつかのファイルに、パスワードの 1 つがコミットされています。このパスワードを履歴全体で他の文字列に自動的に置き換えて、痕跡を残さないようにする方法はありますか? 理想的には、検索して置換する文字列を受け取り、それ自体ですべての作業を実行する簡単な bash スクリプトを記述できれば、次のようになります。

./replaceStringInWholeGitHistory.sh "my_password" "xxxxxxxx"

編集:この質問は重複ではありませんそれですファイル全体を削除せずに文字列を置き換える方法について質問しているからです。

ベストアンサー1

git filter-repo --replace-text

Git 2.25ではすでにの代わりにman git-filter-branchを使用することが明確に推奨されているので、ここで説明します。git filter-repogit filter-tree

インストールhttps://superuser.com/questions/1563034/how-do-you-install-git-filter-repo/1589985#1589985

python3 -m pip install --user git-filter-repo

そして次のように使用します:

echo 'my_password==>xxxxxxxx' > replace.txt
git filter-repo --replace-text replace.txt

またはBashマジックと同等のもの:

git filter-repo --replace-text <(echo 'my_password==>xxxxxxxx')

このシンプルなテスト リポジトリでテストしました:https://github.com/cirosantilli/test-git-filter-repositoryおよび置換文字列:

d1==>asdf
d2==>qwer

上記はデフォルトですべてのブランチに作用します (非常に侵襲的です!!!)。選択したブランチにのみ作用するには、以下を使用します。git filter-repo: 特定のブランチで使用できますか?例えば:

--refs HEAD
--refs refs/heads/master

指定されたコミット範囲に対してのみ操作するには、次の操作を実行します。ブランチ履歴全体ではなく、git filter-repo を使用してコミットの範囲のみを変更するにはどうすればよいですか?

--refs HEAD~2..master
--refs HEAD~2..HEAD

オプション--replace-textオプションについては、次の場所で説明されています。https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/Documentation/git-filter-repo.txt#L155

--replace-text <式ファイル>::

見つかった場合に置換される式を含むファイル。デフォルトでは、各式はリテラル テキストとして扱われますが、 とregex:プレフィックスglob:がサポートされています。行の最後に と==>置換テキストを入力すると、デフォルトの 以外の置換の選択肢を選択できます***REMOVED***

1 つのファイルで置き換える方法:git-filter-repo 単一ファイル内の式でテキストを置換する

もちろん、パスワードを公開してしまうと、もう手遅れで、パスワードを変更する必要があります。そのため、この場合は置換を気にする必要はありません。Git 履歴から機密ファイルとそのコミットを削除する

関連している:Git 履歴内のファイルからテキストを置換するにはどうすればよいですか?

git-filter-repo ac039ecc095d でテスト済み。

おすすめ記事