コミットメッセージに制限を付ける

コミットメッセージに制限をつけたくないですか?僕はつけたいです

ということで、Git フック を使用して実装してみました

Git フック とは

git コマンドの実行前後に指定したスクリプトを動かせる仕組みです

.git/hooks/pre-commit.git/hooks/commit-msg などを作成して動かします

対応しているものは多く、下記のサイトで一覧のようなものを参照できるかと思います

実装

今回はコミットメッセージに制限をかけたいので、使用するフックは .git/hooks/commit-msg になります

デフォルトではファイルは存在しないので.git/hooks/commit-msg を作成し、以下を記述します

#!/usr/bin/python3
import sys
import re
import codecs

path = sys.argv[1]

with codecs.open(path, mode='r', encoding='utf-8') as f:
  commit_message = f.read()
  
  if re.match(r'/#[0-9]+:/', commit_message) == None:
    print('fatal: No issue number at the beginning of the commit message.')
    print('       The accepted format is as follows:')
    print('              #[0-9]+:')
    print()
    print('       The valid example: git commit -m \'#10:Update README.md\'')
    exit(1)
$ git commit -m "hoge"
fatal: No issue number at the beginning of the commit message.
       The accepted format is as follows:
              #[0-9]+:

       The valid example: git commit -m '#10:Update README.md'

実装の説明

このフックが呼ばれる際に、実行時引数としてコミットメッセージが書かれたファイルのパスが渡されます

ためしに先の実装の冒頭に以下を記述した結果を見てみます

print(sys.argv)
['.git/hooks/commit-msg', '.git/COMMIT_EDITMSG']

ということで、コミットメッセージを取得するためにはパスを受け取ってファイルを開くという手順が必要になることが分かりました

先述した実装ではsys.argv[1] でファイルパスを取得し、utf-8 で開いてその中身を正規表現にかけています

もし一致しなかった場合はエラーメッセージを出力するようにしています

あとがき

便利~