フォーマットに従ったコミットメッセージを書くために作ったもの


[![スクリーンショット 2024-03-12 14.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/5a897259-54d1-d321-19f9-11ad04d7181c.png)](https://shiba-tools.dev/)

はじめまして、ShibaToolsというWebオンラインツールを趣味で開発・運営しているnkitaoといいます。

タイトルに記載のとおり、フォーマットに従ったコミットメッセージを書くために作ったものと、その経緯について書きます。

## 経緯

個人開発を１年半ほどやってみて、[プライベートなガントチャート](https://qiita.com/nkitao/items/cd70fc8f0fbc0983ec69)や[ChatGPTで英語を学習](https://qiita.com/nkitao/items/a5f11b75c9033b75d34b)というツールを作ってきましたが、プライベートな事情もあり一旦個人開発から離れていました。

なんやかんやあり、もろもろ落ち着いてきたので、個人開発再開するぞ〜！と思い、前回のプロジェクトの修正・改修した内容（コミットメッセージ）を振り返ってみたところ・・・
![スクリーンショット 2024-03-12 13.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/4dd8f7f2-6889-8350-9ca1-ca49b4ec5bcd.png)

と、まぁ、載せるか躊躇するレベルの酷さで、いかに適当にログを残してたんだなぁと反省しました。
そこでこの機会にフォーマットに従ってちゃんとコミットメッセージを残そうと思い至りました。

## なぜフォーマットに従うのか？
当然のことかもしれませんが、どうしてフォーマットに従う必要があるのでしょうか？
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)では、仕様定義することで、自動化ツールの導入が容易になるとの記述がありました。
>Conventional Commits の仕様はコミットメッセージのための軽量の規約です。 明示的なコミット履歴を作成するための簡単なルールを提供します。この規則に従うことで自動化ツールの導入を簡単にします。

私は使ったことはないのですが[About](https://www.conventionalcommits.org/en/about/)ページの「Tooling for Conventional Commits」に、関連するツールの一覧がありました、
おそらく、バージョン管理やリリースを自動的に行うためのツールであったり、過去のログを分析するためのツール？のようなものだと思います。
確かにプロジェクトが大きくなり、本格的にバージョン管理しはじめると必要不可欠になってくる気がします。

また、Conventional Commitsは[Angular - Commit Message Format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit-message-header)からインスパイアされたらしく、また、Angularは[AngularJS](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w)からインスパイアされたみたいです。

Angular、AngularJSのガイドラインを見ると、主にフォーマットを定義する理由としては、
過去の履歴を追いやすくし、CHANGELOGを自動生成するために利用されているとの記述がありました。
Angularリポジトリでは、CHANGELOGの情報がそのままリポジトリのリリースとリンクしていたので、厳密にフォーマットが定義されているのだなと感じました。

下記はその[一例](https://github.com/angular/angular/releases)です
![qiita - article.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/65dd3359-e2c1-9f5a-d34b-d6b090e200ef.png)[Angularのリリースページと関連するコミットメッセージ]

また、過去の履歴を追いやすくすることで、メンテナンス性は確実にあがりますし、過去同様な修正があった場合や、コントリビューターがプロジェクト参入後に状況を把握しやすいという観点から、生産性の向上にも寄与すると思います。

また、QiitaやZennに投稿されている記事にもいくつか書かれているとおり、コミットメッセージを統一することでのメリットは十分あるのだとわかりました。

↓↓参考にさせていただいた記事 :bow: 

https://qiita.com/pasca-l/items/40bb1d4e9afa3033db2e

https://zenn.dev/itosho/articles/git-commit-message-2023


## 実現したいこと
自分なりにちゃんとしたコミットメッセージを残すための要件をいろいろまとめると、以下のような本当に自分だけにマッチしそうな条件になってしまったので、自分でツールを作ることに決めました。
* フォーマットに従ったコミットメッセージが作成できること
* フォーマットをカスタマイズできること
* インストール不要であること
* 過去の入力情報を再利用できること（スコープとかで使いたい）
* コミットメッセージに絵文字を使いたい
* 絵文字使いたいけど、毎回コピペするのは避けたい
* なんかWebツールつくりたい

## 実現したこと
そして出来上がったのがこちらです :clap: 
[コミットメッセージ作成ツール](https://shiba-tools.dev/tools/commit-support-original)
[![スクリーンショット 2024-03-09 21.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/ab0e1376-5ac4-9cf2-e825-aa70d1988af7.png)](https://shiba-tools.dev/tools/commit-support-original)


## 使い方
使い方は非常にシンプルで、種別、要約、スコープ、本文、フッターにコミットメッセージを記入するだけで、右側の出力エリアにフォーマットされたコミットメッセージが表示されます。（※スマホの場合は、入力エリアが上部で、出力エリアが下部になります。）
必要であれば`git commit -m`コマンドも一緒にコピーできます。

## こだわったところ
UIや各機能はどれもこだわったところなんですが、特に以下の部分こだわりました。
* **カスタマイズ機能**
プロジェクトごとに自由にテンプレートをカスタマイズ＆制限なく作成することができます。
プロジェクトによって種別（feat、fix、build等）で利用するもの利用しないものが変わってくるかと思いますが、プロジェクトに合わせて自由に追加・削除ができます。

* **保存できるドロップダウン** 
スコープの項目の動的ドロップダウン（Dynamic-Dropdown）は、過去に入力した情報を自動的に保存してくれる項目になります。
私だけじゃないと思いたいのですが、以前入力した情報を再利用したいケースがありませんか？
以前どんな記述をしたのか思い出すのにログを漁ってるうちに諦めて、それっぽい命名をしたところ、やっぱり表記揺れがあり悲しくなったことは少なくないです。

* **キーボードファースト**
Webサービスになるので、どうしてもブラウザを開いてアクセスという手間かかってしまいます。
この手間はどうしようもないですが、少なくともメッセージを作成する上でマウスでカチカチしなくてもキーボードから手を離さずに
コミットメッセージを作成できるように心がけました。

## 苦労したこと
コミットメッセージのフォーマットを作成するにあたり、はじめのほうで記載した一般的なフォーマットを知る必要がありました。
* [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/)
* [Angular - Commit Message Format](https://github.com/angular/angular/blob/68a6a07/CONTRIBUTING.md#commit)
* [AngularJS Git Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w)
* [Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716)

上記の仕様を読み、本ツールで提供するデフォルトのフォーマットはできるだけ汎用的なものにいようとこころがけました。
例えば、[AngularJS Git Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w)に以下のように記載されているとおり
> Any line of the commit message cannot be longer 100 characters! This allows the message to be easier to read on github as well as in various git tools.

１行あたりの文字数を100文字以内に収めたほうが、ツールを介してログを確認する際に便利となるケースが多いため、本ツールではその旨のメッセージを表示します。

:::note
100文字を超えた時点メッセージは表示されますが、100文字以上のメッセージを作成することもできますし、コピーすることも可能です。あくまで補足情報として表示されます。
:::

なお本ツールの作成に際して、Angularのコミットメッセージフォーマット用のツールも作成しているので、お時間あればこちらも見ていただけると嬉しいです。

https://shiba-tools.dev/tools/commit-support-angular


## 最後に
早速上記ツールを使ってコミットメッセージを作成すると。
下記のように個人的にはテンションのあがる日本語が変なコミットメッセージを作成することができました。

![スクリーンショット 2024-03-12 22.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/4d08799f-3a2e-bbc3-246e-68fc6a07a3ba.png)


ある程度慣れてくると、ツールがなくても自然と書けるようになってくるので、その時点ではこのようなツールは必要なくなるかもしれませんが、久しぶりにコミットする場合や、git初学者、私と同じような考えを持った人には有益なツールになるんじゃないかなと思っています！