12

私はしばらくの間gitリポジトリに取り組んでいて、いくつかのコミットを行いました。私は次のように、プライベートメールアドレスを含むphpファイルでドキュメントブロックを使用しています。

/**
 * Bla bla bla.
 * 
 * @author:      Nic <foo@bar.com>
 */

これで、新しい電子メールアドレスを作成し、ドキュメントブロックを更新して、古いアドレスを新しいアドレスに置き換えました。ただし、この変更は、ドキュメントを変更した後のコミットにのみ適用されます。

gitの履歴から古いメールアドレスを完全に削除し、すべてのインスタンスを新しいアドレスに置き換えるにはどうすればよいですか?

このブログ投稿を使用してgitfilter-branchを使用してみましたが、成功しませんでした。次の結果が得られます。

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#old-email@example.com#new-email@foobar.com#g"' -- --all
Usage: git core\git-filter-branch [--env-filter <command>] [--tree-filter <command>]
        [--index-filter <command>] [--parent-filter <command>]
        [--msg-filter <command>] [--commit-filter <command>]
        [--tag-name-filter <command>] [--subdirectory-filter <directory>]
        [--original <namespace>] [-d <directory>] [-f | --force]
        [<rev-list options>...]

メールアドレスの特殊文字(@と。)が正規表現を台無しにしている可能性がありますか?それ以外は何が悪いのかわかりませんが、助けていただければ幸いです。

4

3 に答える 3

9

別のオプションは、次のようにフィルターブランチを試すことです。

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Nick NLD" ];
  then export GIT_AUTHOR_EMAIL=your_new_email@example.com;
  fi; git commit-tree "$@"'
于 2012-11-25T15:02:47.420 に答える
4

使用法に関するメッセージが表示される理由がわかりません。コマンドをコピーして貼り付けると、フィルター ブランチが実行されます。ただし、実際にはファイルを変更しませんでした。それは確か@に、メールアドレスの文字が原因で、perl が@emailリスト変数として扱い、それをその (存在しない) 内容に置き換えます。したがって、正規表現は を探していましたold-email.com

これは、perl コマンド\@の記号の代わりに使用することで修正できます。@古い電子メール アドレスの.は正規表現の特殊文字ですが、それ自体は他のものと一致します。この場合、残りのパターンは問題にならないほど厳密である可能性が高いため、おそらくそれをエスケープする必要はありません。

于 2012-11-25T15:36:43.500 に答える