Ruby
Git

コミットの時にブランチ名とprefixチェックをしてみた

コミットメセージにブランチ名とプレフィックスを追加するようにしているが、ために忘れることがあるためミスが起きないように以下の2点をgit hookに追加した。

  • コミットメッセージの先頭にブランチ名を付けること(prepare-commit-msg)
  • コミットメッセージにprefixが記述されているかチェックすること(commit-msg)

prepare-commit-msg側

ブランチ名を取得してそれをコミットメッセージの先頭に追加すれば問題ないと思いましたが、コミットメッセージの修正のためにgit commit --amendをするとそのたびにブランチ名が追加されてしまいます。
そのため、既にコミットメッセージの先頭にブランチ名が追加されている場合には削除する処理も追加しました。

#!/usr/bin/env ruby

branch = `git branch | grep '*'`.chomp.sub('* ', '')
commit = File.readlines(ARGV[0])

if ARGV.length==0
  return
end

index = commit[0].index(branch)
if index != nil && index == 0
  commit[0] = commit[0].sub(/^#{branch}\s/, "")
end

open(ARGV[0], 'w') {|file|
  file.print "#{branch} "
  file.puts commit
}

commit-msg側

コミットメッセージ内にprefixが記述されているかをチェックし、記述がなければ記述するよう促すメッセージを表示する処理にしました。

#!/usr/bin/env ruby

commit_message = File.readlines(ARGV[0])

filter=/(feat|style|chore|refactore|test|doc|fix)+:/

warning_message=<<COMMIT_WARNING
*****************************************************************************
Add a prefix when committing

feat (feature)
fix (bug fix)
docs (documentation)
style (formatting, missing semi colons, …)
refactor
test (when adding missing tests)
chore (maintain)
*****************************************************************************
COMMIT_WARNING

if !filter.match(commit_message[0])
  print warning_message
end

今回は既存のプロジェクトに追加しましたが、新規に作成することも考慮するとgitのhookを全リポジトリで共有するよう設定したほうが良いかもしれません。
また、git hookが上手く動作しない場合はエラーメッセージを確認する、もしくは権限設定が漏れていないか確認してみてください。

以下の記事を参考