Git Hooks
これは何?
Gitのフックスクリプトです。
構成
pre-commitは、masterブランチでのコミットを拒否するだけです。 常にトピックブランチで作業しましょう。
commit-msgはトピックブランチのブランチ名に含まれるチケットIDを抽出し、 コミットメッセージの一行目に自動的に追加します。 Redmine用です。
common.shはそれらに必要な関数を放り込んであります。
test-suite.shは、test_から始まるファイルをすべて実行します。 つまり全部のテストが実行されます。
test_から始まる各種ファイルはテストです。 shunit2というのを使っていて、これがLGPL v2.1なので、 こいつらの扱いはLGPLになるんでしょうか? スクリプトファイルに対するLGPLはよくわかりませんが、 これらはLGPLということにしておきます。
shunit2ディレクトリはshunit2のソース含めすべて入っています。 shunit2は http://code.google.com/p/shunit2/ で配布されています。
updateはチケットIDのないpushを拒否します。 チケットのない作業はやらないようにしましょう。
使い方
ローカルのリポジトリ
使いたいリポジトリの.git/hooks配下に以下のファイルを配置してください。
- common.sh
- commit-msg
- pre-commit
リモートのリポジトリ
使いたいベアリポジトリのhooks配下に以下のファイルを配置してください。
- update
トピックブランチのブランチ名について
commit-msgでチケットIDの自動入力を行いたい場合、 トピックブランチは以下の命名規則に従う必要があります。
- id/チケットIDを含む
- idは最上位の階層、もしくはその直下の階層である必要がある
- チケットIDより後には、階層をいくつでも追加できる
例えば、以下のブランチ名の場合、チケットIDの自動入力が行われます。
- id/42
- bug/id/10
- id/1/memo/memo/memo
- issue/id/20/memo/memo/memo
このようなブランチ上でコミットした場合、コミットメッセージの一行目の最後に、 「 refs チケットID」が追加されます。 refsの前に空白を入れるので、Redmineの場合何も気にせずに使えます。
チケットIDの自動入力が行われないブランチ名の例としては、
- temp
- id/42d
- bug/bug/id/10
などがあります。
テスト方法
test-suite.shを実行するだけですが、hogeというブランチを作ったりいろいろとやるので、 コミットしていない変更がない状態で実行する方がいいでしょう。 作成するファイルやブランチにどのようなものがあるかは実際にコードを読んでください。
今後
git initした直後のコミット
現状ではmasterだと問答無用でコミットできないので(--no-verify?知りません)、 最初のコミットくらいは許可しないとどうしようもない。 あと全部のリポジトリでmasterでのコミット拒否が必要かといわれると・・・なので、 オプションにするかも。
すでにrefsがある場合にさらにrefsを付けないようにする
git commit --amendとかrebaseとかでrefsが無限増殖するので、 すでにある場合は付けないようにしたい。いや、すべき。 さらに、付けようとしてるチケット番号とすでに付いてるチケット番号が違う場合になんかしたい。
設定ファイル化
Redmine固定とかその他いろいろなところで微妙な部分が多いので、 設定ファイル化して・・・とかできるといいですね。
フックスクリプトの配布
いい感じにフックスクリプトをcloneしたリポジトリにも配布できる仕組みとか欲しいですね。 全自動は無理っぽいですけど・・・
クライアント側 $ curl https://github.com/bleis-tift/Git-Hooks/raw/master/install-on-client | sh
サーバ側 $ curl https://github.com/bleis-tift/Git-Hooks/raw/master/install-on-server | sh
ライセンス
test_から始まるスクリプトと、shunit2ディレクトリ以下は前述のとおりLGPL(v2.1)です。 それ以外はNYSL(0.9982)とします。