2012-01-08 9 views
4

対話モードを使用せずにコミットの自動リワード(ハッシュで識別)を実行できますか?私が目指しているのは、コードから呼び出す必要があるため、リワインドのための1つのライナーです。対話型リベースなしでリワードをコミットしますか?

更新日:

インラインで少し変更しました。

git filter-branch --msg-filter "ruby -e \"puts (ENV['GIT_COMMIT'] == '1ba2dd66581f6fbc03d1a6406a0ed61b6473c9ab' ? 'new msg' : STDIN.read)\"" HEAD

は(ルビーなし)純粋なbashでいえいいだろうが、私はSTDINは(読み取りを使用して)動作するようになってとのトラブルを持っていました。

+0

コミットにリセットして、コミットコメントを変更して、元のブランチからそれに続くコミットをチェリーピックすることができます。しかし、それより簡単な方法があるように思えます。 –

+0

['git-filter-branch'](http://linux.die.net/man/1/git-filter-branch)は、特に' --msg-filter'オプションのように見えます。しかし、書き直すことをどのように伝えるべきかを理解することができません。 –

+0

純粋なbashでこれをしようとしているなら、私は条件付きロジックのやり方を知らないのですが、 'if'の場合は 'echo'を使うことができ、' else 'の場合は 'cat STDINをSTDOUTにコピーするだけです。 –

答えて

5

git-filter-branchあなたが望むことができます。具体的には、引数が必要です。

これは、コミットメッセージを書き換えるためのフィルタです。引数は、標準入力で元のコミットメッセージを持つシェルで評価されます。その標準出力が新しいコミット・メッセージとして使用されます。

一つしわgit-filter-branchはあなただけコミット(そして効果的に休息をリベース)書き換えたいしながら、すべてのは、ブランチにコミット上で実行したいということです。したがって、メッセージフィルタには、新しいコミットコメント(書き換えたい実際のコミット)または元の変更されていないコミットメッセージ(他のすべてのもの)を出力するための条件付きロジックが必要です。それはあなたのスクリプトを呼び出す前に、現在のディレクトリを変更しますので、あなたは完全に/path/to/filter.rbを修飾する必要があります

git filter-branch --msg-filter "ruby /path/to/filter.rb 843c2da5e07de914ea2319fa3295730ff8b3b0a1 'New message'" HEAD 

git-filter-branch

これは、トリックを行います。ここで

filter.rbです:

if ENV['GIT_COMMIT'] == ARGV[0] 
    puts ARGV[1] 
else 
    puts STDIN.read 
end 

これはおそらく、おそらく別のファイルにメッセージフィルタスクリプトをかけることなく、シェルスクリプトでより簡潔に書き換えることができ、しかし、私はWindows上で実行しているので、私は何も想像もしません。私はRubyを持っているので、私はそれを使い、それはうまくいく。

+0

素晴らしい!ハッシュコードのセマンティクスはここで少し変更されていますが、 'git'は通常、ハッシュコードがあいまいである場合に不平を言います。あなたのコードはあいまいなハッシュコードのすべてのコミットを変更しているようです。問題ではなく、心に留めておくべきこと:申し訳ありませんよりも安全です。 – alf

+0

@alf、私は同じ7文字の16進数の接頭辞を持つ約2つのコミットについては考えていませんでした。あなたは、この場合に望ましくない影響を及ぼすことは間違いありません。安全のため、完全なハッシュを要求するようにコードを変更しました。 OPがこれをプログラムで呼び出すと、とにかく完全なハッシュが使用可能になります。 –

関連する問題