コミットメッセージにチケット番号+[半スペ]が無い場合エラーを返すスクリプト


業務ルールでRedmineとコミット内容を紐ずけるため、#00000 コミットメッセージでコミットをするという内部ルールがあります。
ただうっかり入力し忘れたり、半角スペースが全角スペースになってRedmineと紐図かなかったりというまれにあったので、Gitフックを使用して対策をしてみたいと思います。

Gitフックとは

Gitフックは、Gitでコマンドを実行する直前もしくは実行後に特定のスクリプトを実行するための仕組み。

commit-msg フック

コミットメッセージを入力後、処理を走らせることができる。
以下格納先。

.git/hooks/commit-msg

.sampleを外し、フックスクリプトとして使用する。
他にも、
コミット直前に実行:pre-commit
プッシュ直前に実行:pre-push
など色々とある。

Rubyで書く

個人的にRubyを学習中だったのでRubyでスクリプトを記述しました。
1行目に以下を記述。

#!/usr/bin/env ruby

#!はシェバングと言い、これ以下に書いてあるコマンドで実行し直してくれる。
/usr/bin/env を使う事でwhich rubyで出てくる環境依存のPATHを記述しなくてもよくなる。
/usr/bin/envも実は環境依存だがほぼ共通で入っている。。。はず。

内容

#!/usr/bin/env ruby

# #00000+[半スペ] 、Mergeコミット以外エラー
message = File.read(ARGV[0])
$regex = /#\d+\s|^Merge branch/

if !$regex.match(message)
  puts "\e[31mチケット番号入力してください\e[0m"
  exit(1)
end

ARGV(アーグヴイ)

コマンドラインからスクリプトの引数として与えられた文字列を要素として持つ。

 # ファイルを読み込んだ際コマンドラインの第一引数を実行する
File.read(ARGV[0]) 

matchメソッド

正規表現とmatchメソッドを使用し、定義した正義表現に当てはまらない場合はエラーメッセージを実行し処理を中断させる。

exitコマンド

エラーの文字列を表示した後、exitコマンドで処理を終了させる。
exit(0):正常終了
exit(1):以上終了

色を変更する

エラーメッセージの色を変えた方が視覚的にわかりやすいのでメッセージの色を変更する為、エスケープシーケンスを使用。

エスケープシーケンスとは
ターミナル上で色を含む特定の制御を実現するための特殊な文字列

print "\e[31mhello\e[0m" # 赤色

感想

Gitフックをもっと活用すれば、コミット前orプッシュ前にエラーを検知したり色々なことができそう!
一番手こずったのはシェバングでした!!
(最初書き方がわからず全然Rubyを認識しませんでした。。。)