2012-11-25 21 views
7

しばらくの間gitリポジトリで作業していて、コミットしました。Gitの履歴のメールアドレスを変更する

/** 
* Bla bla bla. 
* 
* @author:  Nic <[email protected]> 
*/ 

は、今私は、新しいメールアドレスを作成し、ドキュメントブロックを更新し、新しいものと古いアドレスを交換している:私はこのように、私のプライベートのメールアドレスを含め、私のPHPファイルにドキュメントブロックを使用してきました。しかし、この変更は、ドキュメントを変更した後のコミットにのみ適用されます。

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

this blog postを使用してgit filter-branchを使用しようとしましたが、成功しませんでした。

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#[email protected]#[email protected]#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>...] 

が、それはその電子メールアドレスの特殊文字(@と。)だろう正規表現をめちゃくちゃにされています。私は、次のような結果を得ますか?それ以外に何が間違っているのか分かりません。どんな助けもありがとう!

答えて

3

別のオプションは、フィルタ分岐をこのようにしようとしている:

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Nick NLD" ]; 
    then export [email protected]; 
    fi; git commit-tree "[email protected]"' 
+4

これはコミットの作者だけを変更するだけで、ファイルコンテンツの電子メールアドレスを変更する方法を探しています。 – qqx

+0

すでにqqxがコミットのメールアドレスを変更したと判断しました。ファイル内のドキュメントブロックではありません。 –

+2

これは "=="の代わりに "="を使ってうまく動作します。 –

4

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

これは、perlコマンドの@の代わりに\@を使用することで修正できます。古いメールアドレスの.は正規表現の特殊文字ですが、他のものと一致します。この場合、パターンの残りの部分は、それほど重要ではないので、実際にはそれをエスケープする必要はありません。

+0

ありがとうございます。おそらくfilter-branchが動作するように何かを設定すべきでしょうか?私はちょっとしたことに気をつけて、以前はフィルタブランチを使ったことはありませんでした。 –