commit.templateのすすめ

# はじめに

### commit.templateとは

[8.1 Git のカスタマイズ - Git の設定](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)
> システム上のファイルへのパスをここに設定すると、Git はそのファイルをコミット時のデフォルトメッセージとして使います。
> ~
> コミットメッセージについてチーム内に所定の決まりがあるのなら、その決まりに従ったテンプレートをシステム上に作って Git にそれを使わせるようにするとよいでしょう。そうすれば、その決まりに従ってもらいやすくなります。

つまり、コミットメッセージのテンプレートを設定しておけるということです。
`git commit`コマンドを打つと設定しているエディタに表示されます。
（`git commit -m "〇〇〇"`のようにコミットメッセージをあらかじめ入力する場合は表示されません。）

#### commit.templateの使用手順

[8.1 Git のカスタマイズ - Git の設定](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)を参考に記載します。

1.~/.gitmessage.txtファイルを作成する（ファイル名や場所は任意でOKです）

```txt:~/.gitmessage.txt
subject line

what happened

[ticket: X]
```

2.git configに設定する

```shell
$ git config [--global] commit.template ~/.gitmessage.txt
# --global, --local等は任意で。
```

3.コミットコマンドを打つと…

```shell
$ git commit
```

4.コミットメッセージの雛形として以下のような内容が設定しているエディタに表示されます

```
subject line        # ★ここから

what happened

[ticket: X]         # ★ここまでがテンプレート内容
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   lib/test.rb
#
~
~
".git/COMMIT_EDITMSG" 14L, 297C
```

#### 解除方法

gitのconfigファイルから以下の記述を削除すればOKです。

```txt:global設定した場合は、~/.gitconfig
~
[commit]
	template = ~/.gitmessage.txt
~
```

# 活用例① prefixや絵文字のカンペを書いておく

### やりたいこと

コミットメッセージにprefixや絵文字を使う有用性についてはすでに色々な方が記事を書かれています。

- [【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話 - Qiita](https://qiita.com/numanomanu/items/45dd285b286a1f7280ed)
- [Gitのコミットメッセージの先頭につけた方が良い単語リスト(prefix集) - Qiita](https://qiita.com/muranakar/items/20a7927ffa63a5ca226a)
- [僕が考える最強のコミットメッセージの書き方 - Qiita](https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e)
- [GitHubのコミットメッセージに絵文字を入れて開発効率をあげる - Qiita](https://qiita.com/Jung0/items/0a9a7a97a2c17f92d3c5)
- [Gitのコミットメッセージに絵文字を入れて社内の開発効率をあげた話【Emoji Prefix】 - Qiita](https://qiita.com/oekazuma/items/0ce5082a07fe5c942de3)

そのルールを一々どこかへ確認しに行くのは面倒なので、コミットテンプレートに書いておこうというわけです。

### 設定例

[Angular.jsの公式ドキュメント](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type)のprefixを参考にされている記事が多く個人的にもわかりやすいと思ったので、Angular.jsの例を記載します。
絵文字はAngular.jsの例に対応するものを書きました。
```txt:~/.gitmessage.txt
# ==== Prefix ====
# fix:      A bug fix
# feat:     A new feature
# docs:     Documentation only changes
# style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
# refactor: A code change that neither fixes a bug nor adds a feature
# perf:     A code change that improves performance
# test:     Adding missing or correcting existing tests
# chore:    Changes to the build process or auxiliary tools and libraries such as documentation generation
#
# 参考：https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type

# ==== Emojis ====
# :bug:         🐛 バグ修正 (fix)
# :sparkles:    ✨ 部分的な機能追加 (feat)
# :memo:        📝 ドキュメント修正 (docs)
# :lipstick:    💄 Lintエラーの修正やコードスタイルの修正 (style)
# :recycle:     ♻️ リファクタリング (refactor)
# :rocket:      🚀 パフォーマンス改善 (perf)
# :green_heart: 💚 テストやCIの修正・改善 (test)
# :bento:       🍱 依存パッケージなどのアップデート (chore)
#
# 絵文字一覧：https://gitmoji.dev/
```

:::note info
絵文字はUnicode文字の一部であり、GitクライアントやテキストエディタがUnicodeに対応している場合、絵文字は正しく表示されます。
:::

# 活用例② ブランチ名に従い特定の文言をコミットメッセージの先頭に自動付与

### やりたいこと

ブランチ名にチケット番号を記載し、コミットメッセージはチケット番号から開始する運用ルールがあるとします。

```
例）
ブランチ名         ticket-1234567
コミットメッセージ  refs #1234567 [コミットメッセージを記載]
```

このとき、毎回「refs #1234567」という文字を打つのは面倒ですよね。
なのでこれを自動化します。

### git hooksという仕組みを用います

[Git - Git フック](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
> ~
> Gitにも特定のアクションが発生した時にカスタムスクリプトを叩く方法があります。このようなフックは、クライアントサイドとサーバーサイドの二つのグループに分けられます。
> クライアントサイドフックはコミットやマージといったクライアントでの操作の際に、サーバーサイドフックはプッシュされたコミットの受け取りといったネットワーク操作の際に、それぞれ実行されます。 これらのフックは、さまざまな目的に用いることができます。

フックにはいろいろな種類がありますが、その中の`prepare-commit-msg`を使います。

### 設定手順

1.prepare-commit-msgファイルを作成する

```:.git\hooks\prepare-commit-msg
#!/bin/sh

# git rev-parse --abbrev-ref HEAD 現在のブランチ名を取得するgitのコマンド
current_branch=$(git rev-parse --abbrev-ref HEAD)

# ブランチ名が「ticket-」を含むなら
if [[ "$current_branch" == *ticket-* ]]; then

    # ブランチ名の文字列の添字7(=8文字目)から7文字を抽出
    ticket_number=${current_branch:7:7}

    # 文字列結合
    prefix="refs #${ticket_number}"

    # sed s=スクリプト/変更前/変更後 $1=スクリプト実行対象
    sed -i "s/\[prefix\]/$prefix/" $1
fi
```

2.コミットテンプレート用のファイルに、prepare-commit-msgで指定した変数名を書いておく

```txt:~/.gitmessage.txt
[prefix]
```

3.コミットコマンドを打つと…

```shell
$ git commit
```

4.開いたエディタの先頭に「refs #チケット番号」と記載されています
![2023-08-13-17-11-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1189089/9217fd1c-c6ae-89f0-44e5-5583087d8503.png)
素晴らしい◎
(画像はVSCodeのエディタです)

#### 課題

- **７桁以外のチケット番号に非対応**
先ほどのprepare-commit-msgの書き方だと、７桁以外のチケット番号の場合は対応できていません（私がシェルスクリプトに慣れていないだけですが…）。
改良できたら追記します。

- **VSCodeだとcommit.templateに反映されているか分からない**
こちらの設定をするとVSCodeのサイドバーのコミットメッセージ入力欄に[prefix]という文字が表示されます。
![2023-08-13-17-17-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1189089/228277bc-9fa8-4371-cd59-662b68b46fae.png)
設定が効いていればここから直接コミットしてもコミットメッセージでは「refs #~」と変換してくれるのですが、
実際にコミットを打つまで変換できているのか若干不安です。
こちらも改良できたら追記します。

# 以上！

どなたかの参考になれば幸いです。