• このエントリーをはてなブックマークに追加

ss-1324860051

はじめに

どのブランチがどのブランチの上に乗っかるか,というルールが複数定義されたファイルを読んでひたすら git rebase を行うためのツール「git-rebase-matsuri」というのを書いてみたので,本エントリで軽く紹介します.

※ とあるコミットポイントにおいてちょっとした主要なコミットが発生したおかげで,そこから派生していたすべてのブランチに対して git rebaase する作業が発生することを,私は勝手に「rebase祭り」などと呼んでおります.

背景

「この機能の実装を進めて」「ちょっとあれを直してほしい」先方からそんな要求がくるたびに,その数だけトピックブランチを,公開状態のコミットポイントから生やして作業しています.で,こちらが作業を完了して報告,公開向けの準備の指示を仰ぐのですが,そこから返信がこなくなります.(まぁお忙しいのでしょうね.)その結果,「公開待ち」な状態のブランチが増えてきます.

コミットツリーは次のような感じになります:

ss-1324859692

そこで飛び込んでくる「これ,あのお客さんにどうしても対応したいから,すぐに実装して反映してほしい」といった要求.私の少量メモリな脳内ではスワップを起こしていますが,対応しなければなりません.そしてその修正を先に公開します.

(本エントリを書いている最中にも,何か1件飛び込んできましたw)

コミットツリーは次のような感じになります:

ss-1324860051

さて,本来の開発作業に戻りますか.しかし,安心して開発を再開するには,コミットツリーを次のようにしておきたいところですね:

ss-1324860499

まぁ git rebase しまくればよいだけですが,いかんせんメンドイ!

使い方

インストール

App::gitrebasematsuri として,CPANモジュール形式で作ってみました.今のところ GitHub にだけ上がってます:

cpanm とかで入れればよいと思います.

インストールできたら, git-rebase-matsuri というコマンドが使えるようになります.

% git-rebase-matsuri
Usage:
      git-rebase-matsuri --conf=<config_file>
      git-rebase-matsuri --conf=<config_file> --doit  # really execute "git rebase"

コンフィグファイル

「どのブランチが,どのブランチ(コミット)に乗っかるか」というルールを任意のファイルを作って記述していきます.

例えば,先の「背景」での rebaase祭り前のヤツ:

ss-1324860051

を,公開最新状態である release-3 タグ (ここでは master ブランチをいっしょ)を起点とした形に rebase したい:

ss-1324860499

とします.

この場合,次のように記述します:

# <branch> -> <onto>
id/1 -> master
id/2 -> ^
id/3 -> master
id/6 -> ^
id/4 -> master
id/5 -> master

->」の左側が「乗っかる」側のブランチ,右側が「起点となる」ブランチ,となります.

記号「^」は,「直前のルールの『左側』のブランチを起点にする」という意味を持っています.もちろん,ブランチ名を直接指定してもOKです.

ファイル名は rebase-matsuri.conf とでもしておきましょう.

コマンドの実行

コンフィグファイルを --conf または -c オプションで指定して実行します.

% git-rebase-matsuri -c rebase-matsuri.conf
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/1 -> master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/2 -> id/1
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/3 -> master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/6 -> id/3
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/4 -> master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/5 -> master
2011-12-26T09:46:33 [WARN] Do you really rebase? specify "--doit" option.

ルールの確認だけできました.実際に git rebase も行うには,--doit オプションをつける必要があります.一応予防線をはってみましたw

では,--doit オプションもつけて実行します.

% git-rebase-matsuri -c rebase-matsuri.conf --doit
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/1 -> master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/2 -> id/1
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/3 -> master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/6 -> id/3
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/4 -> master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/5 -> master
2011-12-26T09:46:59 [INFO] current branch/commit: id/7
2011-12-26T09:46:59 [WARN] Switched to branch 'id/1'
2011-12-26T09:46:59 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:46:59 [INFO] Applying: 7l9mSClY2I6MDToR8Fu5mEhn16Xvxrr4jSiqnyfI. refs #1
2011-12-26T09:46:59 [INFO] Applying: CR5q38OuoIj63HrhelKAFQEshtGPvd6H1mglSaPU. refs #1
2011-12-26T09:46:59 [WARN] Switched to branch 'id/2'
2011-12-26T09:46:59 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:46:59 [INFO] Applying: eymEmpKebkoBHXMvBKh6VoYL0D0S3vYASDf3Evv6. refs #2
2011-12-26T09:46:59 [WARN] Switched to branch 'id/3'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: OJBncdWk5xzkINMCCqiPlRkdH3E7ZEAiUirPWEPq. refs #3
2011-12-26T09:47:00 [INFO] Applying: LFeSI6SsTyKi6ZDIUXQK69zWX4IfB6OT14FCmPU2. refs #3
2011-12-26T09:47:00 [INFO] Applying: YPgXUdxQJCKqOFsukt5jpxOuUCo9gSpLIuOmXQlv. refs #3
2011-12-26T09:47:00 [WARN] Switched to branch 'id/6'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: n3gYUd9m1z12NJ63D3hIrVL7ZDvWnAqFbtbuupdT. refs #6
2011-12-26T09:47:00 [WARN] Switched to branch 'id/4'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: bdqD7UZ9VLyyov3FIQ8Y4r2kGFUsmDlTQHqZYeN4. refs #4
2011-12-26T09:47:00 [INFO] Applying: rQZGVsQrhswVVskKHJ7P3HcDqCR7OtmccozHrRXa. refs #4
2011-12-26T09:47:00 [WARN] Switched to branch 'id/5'
2011-12-26T09:47:01 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:01 [INFO] Applying: GL6q8fM3EI1FhxPqlHInVPfgRfdmdhpmj7uDDKAL. refs #5
2011-12-26T09:47:01 [INFO] Applying: 4nVra34dYs5SrY1it2cACZ3jJw87JQrkSt6Hg3YX. refs #5
2011-12-26T09:47:01 [WARN] Switched to branch 'id/7'

こんな感じで rebase祭りを手軽に執り行うことができます.

もちろん,未コミットなファイルがあったりするとできないので,コミットするか git stash などするかしておくところは従来と同様です.

また,conflictが発生したときは,そこは自力でガンバる必要がありますw

おわりに

以上,rebase祭りを手軽に執り行なうための支援ツール「git-rebase-matsuri」の紹介と,その使い方についてのエントリでした.

さて,飛び込んできた修正依頼に対応して公開して,またrebase祭りを始めるとしますかねw

Amazonさん