簡易的なConventional Commitsを実現するためのzshプラグインの設計および実装

はじめに

これはFolioアドベントカレンダー2024の14日目の記事です。

adventar.org

今回は、簡易的なConventional Commitsを実現するための zsh-select-commit-prefix というzshプラグインについて話します。

アブストラクト

本稿では、ソフトウェア開発におけるコミットメッセージ仕様「Conventional Commits」を簡素化し、日常的な利用での効率向上を図るzshプラグインの設計と実装について述べる。既存のConventional Commits関連ツールは、詳細な構文やリポジトリ単位の設定を求めるものが多く、個人利用や簡易なプロジェクトには過剰となり得る。本研究では、zsh プラグインとして軽量なツールを開発し、1行形式のメッセージ作成、Node.jsランタイムの排除、他ツールとの競合回避を実現した。提案ツールは、簡潔かつ直感的な操作性を備えており、特に個人プロジェクトや小規模チームでの利用に適している。また、拡張可能性を考慮した設計により、今後のAI生成メッセージ対応や他ツールとの統合も見据えている。本稿では、設計背景、技術的工夫、実装方法、そして今後の展望について詳細に解説する。 generated by ChatGPT

1.ConventionalCommitsとは

Conventional Commitsは、人間と機械が読みやすく、意味のあるコミットメッセージにするための仕様 です。この仕様は、Angularプロジェクトのコミットメッセージ規約 Angular Commit Guidelines に基づいて設計されています。

この仕様にはそれぞれ MUST/MUST NOT/REQUIRED/SHALL/SHALL NOT/SHOULD/SHOULD NOT/RECOMMENDED/MAY/OPTIONALの各キーワードが指定されており、その仕様の要件レベルが定義されています。

ここでは具体的な仕様についての説明は省きますが Conventional Commits の具体的な利用方法や適用はO2氏のこちらのスライドが分かりやすいです

コミットメッセージ規約 「Conventional Commits」を導入してみよう! / Let's use Conventional Commits - Speaker Deck

Conventional Commitsは、開発者間でコミットの目的や内容を明確に伝えるために重要です。

Conventional Commits 1.0.0

www.conventionalcommits.org

Angular Commit Guidelines

github.com

Git Commit Message Conventions · GitHub

2.Conventional Commitsに対応したツール

2.1 専用ツール

2.1.1 conventional-commits

PHPライブラリであり、コミットメッセージの作成および検証を行います

https://github.com/ramsey/conventional-commits

2.1.2 cz-cli

czコマンドを通じて、対話形式でコミットメッセージを生成します

https://github.com/commitizen/cz-cli

2.2 commit message の check・lint tool

その他commit messageに関連するツールを紹介します。

2.2.1 commitlint

commitlintは、コミットメッセージが規約に準拠しているかをLintするツールです

commitlint.js.org

www.npmjs.com

www.npmjs.com

2.2.2 opencommit

AIを活用し、コミットメッセージを自動生成を行うツールです

github.com

2.2.3 gitmoji

絵文字を活用してコミットメッセージに視覚的な情報を付加するツールです

gitmoji.dev

3.現状のツールの課題

現在使用されているConventional Commits関連ツールには、以下のような課題が存在します。

1. ランタイム依存性

多くのツールがNode.jsを導入する必要があり、Node.js を利用しないRepositoryでもツールのためにNode.jsの設定をする必要があります。

2. リポジトリ単位の設定

toolの設定がリポジトリに紐づくことが多く、個人レベルでのカスタマイズが難しいです。

3. pre-commitフックへの依存

lintを含むツールの場合pre-commit時にlintを行う場合が多く、意図的に規約外のコミットを行う際にgit commit --no-verify などでlintを回避する使用する必要があり手間がかかります。

4. コミット規約の厳格さ

業務や趣味の開発では、3行構成の詳細なコミットメッセージは過剰であり、1行構成の簡易な形式が望ましい場合があります。業務だとPRのdiscriptionや、社内wikiに詳細仕様をまとめるなどcommit message 以外に情報集約を行うことも多いです。

5. 他ツールとの競合

対話式のツールの場合に他のGit関連ツール(例: tigやscm_breeze)と競合し、利用が制約されるケースがあります。またopencommit、gitmojiなどのcommit関連のツールを利用すると規約に合わなくなってしまう問題があります。

4.改善案と実現方法

これらの課題を解決するために、以下の改善案を提案します。

1. 個人設定に紐づくツール

リポジトリ設定に依存しない設計にすることで Repositoryでの設定を不要にします。

2. 1行形式のコミットメッセージ

Conventional Commitsの仕様でMUSTであるPrefixのみを指定するようにし、必要に応じてメッセージを追加する形式を採用します。

3. ランタイムの簡略化

zshプラグインとして実装し、Node.jsランタイムの依存を排除します。

4. 他ツールとの競合回避

任意利用可能な設計とし、既存のツールやエイリアス設定と干渉しないようにする。

5. 作成したツールの紹介

github.com

作成したツール「zsh-select-commit-prefix」は以下の機能を持ちます。

  • zshプラグイン 形式

    Sheldonなどのプラグインマネージャ経由で導入可能です。

  • Prefixの選択

    pecoを使用してPrefixを選択し、その結果をコミットメッセージに反映します。

  • 統合性

    Prefixを選択後、git.default.editor で指定したエディタが開きcommit messageの編集ができます。

動作例

コマンドを実行し prefixを 選択すると git commit 時と同様の git.default.editor で指定したエディタが表示され、通常の編集操作が可能となります。

スクショ

6. 技術的な工夫

以下のコマンドにより、指定したメッセージを渡しつつ、エディタを開くことができます。

$ git commit -e -m "${prefix}: "

7. 今後の展望

以下の機能追加を検討しています。

  1. opencommit対応

  2. AI生成メッセージを組み込む機能の追加

$git commit -e -m "${prefix}: ${generatedMessage}"

のように指定すれば 統合可能です。

  1. tig対応

git-commit--select-prefix を tig で利用するユーザ定義関数を作成すれば統合可能です。

8. 結論

本稿では、Conventional Commitsを簡易化するためのzshプラグインの作成について話しました。

このツールは、個人利用に適した柔軟性を持ちつつ、既存ツールとの干渉を最小限に抑える設計となっています。

9. おわりに

もう少しまともな内容の記事を書こうとしていたのですが諸々でぽしゃったために、代案でこの記事を執筆しました。

去年は大遅刻をしたので今年は日付通りに投稿できてホッとしています。