2017-01-19 16 views
1

git rebaseを実行し、そのコミットメッセージが特定の正規表現と一致するコミットをドロップします。例えば、それは`git rebase`のコミットメッセージによるコミットを中止します

git rebase --drop="deletme|temporary" master 

のように働くかもしれないし、文字列deletemeまたはtemporaryを含むすべてのコミットを滴下しながら、これはmasterの上にリベースを行うだろう。

標準Gitツールでこれを行うことは可能ですか?もしそうでなければ、サードパーティのGitツールで可能でしょうか?特に、私はそれを非対話的な単一のコマンドにしたい。

+2

誰かがトラブルを探す;) –

+0

意図しない結果が生じていますか? – JeremyKun

+0

'filter-branch'を試してみてください。 –

答えて

1

これは、this answerで使用したのと同じ方法を使用して実行できます。

まず、関連するコミットを見つける必要があります。

git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary" 

これはあなたにmasterとあなたの現在のブランチの間にあるdeletemeまたはtemporaryを含むコミットメッセージとコミットのリストが表示されます:あなたのような何かをすることを行うことができます。これらは、削除する必要のあるコミットです。

保存このスクリプトのどこかで、あなたがそれにアクセスすることができます。

#!/bin/bash 

for sha in $(git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary" | cut -d " " -f 1) 
do 
    sha=${sha:0:7} 
    sed -i "s/pick $sha/drop $sha/" [email protected] 
done 

次にとしてリベースを実行します。これは、自動的にコミットメッセージにdeletemeまたはtemporaryを含むすべてのコミットをドロップします

GIT_SEQUENCE_EDITOR=/path/to/script.sh git rebase -i 

。私の他の回答で述べたように

使用することをコミットしている計算に実行されますが、これは問題であるならば、あなたはおそらく渡すことができるもののコマンドをカスタマイズすることができ、[このスクリプトは許可されません]そのようなカスタマイズを可能にする環境変数に置き換えます。

必須警告:リベースは歴史を書き換えているので、これはこのブランチに取り組んで他の誰のための破壊的/危険なことができます。コラボレーションしている相手と行ったことを明確に伝えてください。

+1

'git log --format = format:"%H%s "と表示されます。 grep -E "deleteme | temporary"には、すべてのコミット(マスター上のコミットを含む)が含まれます。現在のブランチ上のコミットだけを出力するように修正できますか(マスターと比較して)? – JeremyKun

+0

おそらく 'git log HEAD ... master'と思われますか? – JeremyKun

+0

@JeremyKun:確かに、私の答えを更新しました。 –

1

g。インタラクティブなリベースを使用します。したがって、git rebase -i <first commit that should not be touched>を実行してから、コミットのリストを持っているvimで、コミットメッセージがissueで始まるすべてのコミットに対して、ドロップスタンザを使用するために:%s/^[^ ]* \([^ ]* issue\)/d \1/gを実行できます。しかし、git rebaseがマージコミットで最適に動作していないことに注意してください。デフォルトでは、それらはスキップされ、履歴は平坦化されますが、パラメータでそれらを保持しようとすることができます。

+0

私はより具体的にすべきでした、私はこのプロセスを無人で自動化したいと思います。 – JeremyKun

+0

次に、 'git -c core.editor = 'sed -i' s/^ [^] * \([^] * issue \)/ d \ 1/g"のような非対話型エディタを使用してください。 "rebase -i <最初にコミットせずに残す>。手動でのやり取りなしで、上記と同じ効果。 – Vampire