2012-03-16 22 views
2

コミット履歴を書き換えて、特定のキーワードが表示されないようにするにはどうすればよいですか?Gitコミットログの検索/置換

背景:

  1. ローカル - 私たちの開発環境:私たちは、リポジトリの3層を持っています。
  2. 内部 - 私たちのチームのプライベートGHリポジトリ
  3. クライアント - プロダクション/エンドクライアント。私たちの本当の名前、電子メールなどは、ここで決してしてはいけません。

私はすでにこれは素晴らしい仕事に表示されます

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='safeusername'; GIT_AUTHOR_EMAIL='[email protected]'; GIT_COMMITTER_NAME='safeusername'; GIT_COMMITTER_EMAIL='[email protected]';" HEAD 

... git-filter-branchはこのようなものを使用して、名前を取り除くために歴史を書き換えることができますことを発見しました。私が最後のリモートにプッシュすると、私たちの名前のどれも存在しません。しかし、一部のマージでは、偶然に分岐名やその他のコメントが出てくることはありません。

また、私たちの内部のプロジェクト管理システムが機能し透過的になるように、実際の電子メールとユーザー名を設定しておきたいと思います。

コミットにキーワードや名前のリストが表示されないようにするにはメッセージ?また、この問題を解決する他の方法はありますか?

ありがとうございます!

+0

イーケーズ。実際の名前/電子メール*が存在できないリポジトリと存在しなければならないリポジトリの相互運用を求めているのは、危険なことです。 – Cascabel

+0

幸いにも、私はそれらを別々のディレクトリに保ち、どんなフィルターでもプッシュスクリプトに組み込むことができます。また、それは一つの方法です。クライアントからコードを取得することは決してありません。うまくいけばそれはそれをより簡単にする(またはより怖くない)。 –

+1

あなたはまだ情報を漏らしてしまう方向にデータを移動しています。クライアント側で*内部リポジトリに作成したすべての(書き直した可能性のある)コミットを実際に*リポジトリ*が必要ですか? – Cascabel

答えて

0

わかりましたので、あなたはこのような何かを行うために必要一般的な流れは次のとおりです。

  • クローン/無修正レポに引っ張る(おそらく新しいものたびに、おそらく再使用)
  • 実行フィルタマジック:-branch、したがって、最初のクライアントのレポへ

を公開し、すべてが

  • 安全であることを確認し
  • 魔法
  • を行います。 git filter-branch --commit-filter my-commit-filter-scriptを使用します。コミットツリーの代わりに直接呼び出され、必要な引数をとり、stdinのコミットメッセージを呼び出します。だから、このような何かをしたいと思う:

    、どんなコミットツリーに沿って、それをメッセージに必要なフィルタリング、およびパイプ、適切な環境変数を経由して実行を名前や電子メールの変更である
    #!/bin/bash 
    
    GIT_AUTHOR_NAME=$(sanitize "$GIT_AUTHOR_NAME") 
    # ... similar for AUTHOR_EMAIL, COMMITTER_(NAME|EMAIL) 
    
    sed 's/scary-string/safe-string/' | 
    git commit-tree "[email protected]" 
    

    正常に実行された呼び出し。 sanitizeは、名前/電子メールのprivate-> publicマッピングを行う関数/スクリプトを意味します。あなたがしたいのは、それらをすべてひとつの名前に変更するだけなら、そのビットは本当に簡単です。そして、おそらくsedコマンドは少し好きかもしれません。たとえば、変換のテーブルを読み込みます。そのビットは、あなたが行う必要がある浄化の複雑さに応じて、あなた次第です。

    コミットメッセージのフィルタリングを信頼する場合は、この時点で完了です。検証する場合は、手動で行うことも、独立して「危険な」文字列を検索することもできます。たとえば、ファイルがdangerous-strings.txtの場合、git log --pretty="%an %ae %cn %ce%n%B" [branches] | grep -f dangerous-strings.txtを実行できます。(logコマンドは、作成者/コミッターの名前/電子メールに続いてコミットメッセージを表示します。)

    次に、通常のように公開します。

    は最後に、いくつかの代替の提案は、おそらくさまざまな要件と将来の読者のために:

    • 代わりのコミットを書き換え、新しいコミットを作ります。メッセージは、(それが表す内部コミットのSHA1を含む)迅速なバージョニング情報でも、導入されているコミットの短いログ(対象のみ)を含むこともできます。

    • 変更を必要としない形式でリポジトリを保管しておいてください。git merge --squash [--log]を使用して、公開ブランチを維持したり、別のリポジトリで新しくコミットしたりすることでこれを行うことができます。これはOPにとって不可能だと思われますが、あなたの状況が異なる場合は、簡単にしてください。危険性は低く、仕事は少なくなります。

    +0

    ありがとう!私はすぐにこれをテストすることができます... –

    +0

    私のために働いていない - ここに私が使用しているもの/出力するもの:https://gist.github.com/2127452 私が得ることができない場合私はあなたの代わりの提案に行ってそれをエクスポートし、それを新しいリポジトリにダンプするかもしれません。好奇心と学習のうち、私は間違いなくこれを最初にやりたいです。 FYI - "プッシュプッシュ"で、私はgitフックとしてではなく、手動で実行していることを意味します。 –

    +0

    ええと、私はそれをテストしなかったことを認めなければなりません。今日はそうする時間がないかもしれません。その間、use文を出力したので、stdin、コミットツリーに渡すもの、引数を記録し、何かが間違っているかどうかを確認することをお勧めします。 – Cascabel