コミットメッセージに制限を付ける
コミットメッセージに制限をつけたくないですか?僕はつけたいです
ということで、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
で開いてその中身を正規表現にかけています
もし一致しなかった場合はエラーメッセージを出力するようにしています
あとがき
便利~