Ruby
Git

Git Copを使ってgitのコミットメッセージのフォーマットを整える

More than 1 year has passed since last update.

gitを使っているの開発の途中であったり、複数の開発をまとめてコミット
したりする際に適切ではないコミットメッセージをいれてしまって、あとで、
コミットメッセージを辿ったときにいったい何を開発したのかわからないといった
ことになってしまうときがあります。
Git Copを使えば、あらかじめ設定した形式でコミットメッセージを入れているかをチェックできるので、チームで開発している場合でもコミットメッセージに一貫性を保つことができます。

インストール方法

rubyのGemなので以下のコマンドでインストールを行います。
ruby 2.4.1が必要なので、環境に入っていなければ、rbenv等でruby 2.4.1を
インストールします。

gem cert --add <(curl --location --silent https://www.alchemists.io/gem-public.pem)
gem install git-cop --trust-policy MediumSecurity

Git Copがバリデーションに使用するための設定ファイルを
~/.config/git-cop/configuration.ymlに作成します。
設定ファイルがなかったり空ファイルの場合はデフォルト値が使用されますが
最終的にカスタマイズして使用すると思うので、とりあえずGit Copのページにあるデフォルトの
設定をコピーして設定ファイルを作成します。
:commit_body_issue_tracker_link:の項目はドキュメントでは:blacklist:
の項目の末尾にカンマが入っていてconfigurationが全てデフォルト値で
動作するようになってしまうので、以下に修正します。

:commit_body_issue_tracker_link:
  :enabled: true,
  :severity: :error,
  :blacklist:
    - "(f|F)ix(es|ed)?\\s\\#\\d+"
    - "(c|C)lose(s|d)?\\s\\#\\d+"
    - "(r|R)esolve(s|d)?\\s\\#\\d+"
    - "github\\.com\\/.+\\/issues\\/\\d+"

git hooksの設定

コミットメッセージを入力した後にメッセージのチェックをしたいので、
commit-msgのhookを作成します。
対象のgitプロジェクトの.git/hooks/commit-msgを実行可能な権限で作成
して以下の内容にすることで、git-copが使用できます。

.git/hooks/commit-msg
#! /usr/bin/env bash

set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'

if ! command -v git-cop > /dev/null; then
   printf "%s\n" "[git]: Git Cop not found. To install, run: gem install git-cop --trust-policy MediumSecurity."
   exit 1
fi

git-cop --hook --commit-message "${BASH_ARGV[0]}"

Git Copのバリデーション項目とデフォルト値

git-copでは以下の項目のチェックをすることが出来ます。
必要に応じて~/.config/git-cop/configuration.ymlの
値を設定します。

ymlのキー 監視項目 有効/無効(デフォルト値) エラーレベル 備考
:commit_author_email Commit Author Email true error git configのuser.emailの値をチェック
:commit_author_name_capitalization Commit Author Name Capitalization true error git configのuser.nameの値がCapitalizationされているか
:commit_author_name_parts Commit Author Name Parts true error git configのuser.nameの値を姓名に分かれているか。
:commit_body_bullet Commit Body Bullet true error コミットメッセージ本文の箇条書きにMarkdown構文を使用するにするかどうか
:commit_body_bullet_capitalization Commit Body Bullet Capitalization true error コミットメッセージ本文の行をCapitalizationしているか
:commit_body_issue_tracker_link Commit Body Issue Tracker Link true error コミットメッセージ本文にgithub用のissueへのリンクがあるかどうか
:commit_body_leading_line Commit Body Leading Line true error コミットメッセージの題名と本文の間に空白行があるかどうか
:commit_body_leading_space Commit Body Leading Space false warn version 2.0.0で削除されるので説明は割愛します。
:commit_body_line_length Commit Body Line Length true error コミットメッセージの本文の行の長さをチェックします。
:commit_body_paragraph_capitalization Commit Author Name Capitalization true error コミットメッセージの本文の各段落でCapitalizationしているかどうか
:commit_body_phrase Commit Body Phrase true error コミットメッセージの本文に適切でない単語が含まれているかどうか
:commit_body_presence Commit Body Presence true warn コミットメッセージの本文が存在しているかどうか
:commit_body_single_bullet Commit Body Single Bullet true error コミットメッセージの本文で単一の箇条書き表現を許可するかどうか
:commit_subject_length Commit Subject Length true error コミットメッセージの題名の長さに制限を使えるか
:commit_subject_prefix Commit Subject Prefix true error コミットメッセージの題名に特定のprefixを含むかどうか
:commit_subject_suffix Commit Subject Suffix true error コミットメッセージの題名に特定のsuffixを含むかどうか

設定のカスタマイズ

~/.config/git-cop/configuration.ymlを整えたいルールの通りに修正します。

自分の環境ではCommit Author Nameに使う名前が他のシステムの名前
と統一したい都合もあったため、:commit_author_name_capitalizationと:commit_author_name_partsの項目をfalseにしています。また、:commit_subject_suffixのsuffixの設定も感覚的にフィットしなかった
のでfalseにしています。
git commit -mでメッセージを入れてコミットした場合には:commit_body_*系のチェックは動作しないようです。

:commit_author_name_capitalization:
  :enabled: false
  :severity: :error
:commit_author_name_parts:
  :enabled: false
  :severity: :error
  :minimum: 2
:commit_subject_suffix:
  :enabled: false
  :severity: :error
  :whitelist:
    - "\\."

以上になります。