あなたのプロジェクトに秩序をもたらす！git commit 支援ツールを作りました。

## 前置き

- [【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話](https://qiita.com/numanomanu/items/45dd285b286a1f7280ed)
- [Gitのコミットに絵文字を使おう！](https://qiita.com/syu_chan_1005/items/e1a18896107d8cedfc45)

上記のような記事でコミットメッセージにprefixを使うことのメリットが語られています。
実際、自分も今やっている仕事ではコミットにprefixをつけています。

が、これが結構面倒くさい。
「どんなprefixがあったっけ?」「`doc`だっけ、`docs`だっけ?」
みたいな。

prefixを楽にするツールに[commitizen](https://github.com/commitizen/cz-cli)というのがあるけど、これが結構使いにくい。
なぜならprefixの種類が強制されていて自由に変更できないから。

ということで自分好みのツールを作りました。
それが[git-consistent](https://github.com/isuke/git-consistent)です。


![git-consistent01.gif](https://qiita-image-store.s3.amazonaws.com/0/152997/92e41149-3b5d-84ab-bf23-98ebe58cba05.gif)

↑　こんなやつです。

## インストール

npmかyarnでインストールするだけです。

```bash
$ npm install -g git-consistent
# or
$ yarn global add git-consistent
```

## 使い方

`git consistent --gen-config`　と打つと色々聞かれるので答えましょう。

```bash
$ cd my-project/
$ git consistent --gen-config
? Use Type? Yes
? Use Emoji? No
? choice types feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, ui, remove, sec, up, down, tada
? Does the subject start with? lower case
? Does the subject put dot (.) at end? No
Generated '.gitcommit_template' and '.git_consistent'.
You can edit them freely.
Enjoy!
```

そうするとこんな２つのファイルができます。

```text:.gitcommit_template
<type>: <subject>

<body>
```

```yaml:.git_consistent
type:
  type: enum
  required: true
  description: 'commit type'
  values:
    -
      name: feat
      description: 'when implementing function'
    -
      name: fix
      description: 'when fixing a bug'
    -
      name: tada
      description: 'when celebrating'
subject:
  type: string
  required: true
  description: 'The subject contains succinct description of the change'
  rules:
    firstLatter: lower
    dotAtEnd: false
    nonAscii: false
body:
  type: text
  default: ''
  required: false
  description: 'The body contains details of the change'
  rules:
    firstLatter: upper
    dotAtEnd: true
    nonAscii: false
```

あとは`git commit`の代わりに`git consistent -i`と打つだけです。

```bash
$ git consistent -i
? Select type: 
  feat     when implementing function 
  fix      when fixing a bug 
❯ tada     when celebrating
(Move up and down to reveal more choices)
? Write subject: my first commit
```

こんな風にインタラクティブにコミットメッセージを生成することができます。

optionで入力することもできます。option名は`.gitcommit_template`の`<>`で囲まれた名前です。
optionを入力した場合、入力しなかったものだけがインタラクティブに入力できます。

```bash
$ git consistent -i --subject="my first commit"
? Select type: 
  feat     when implementing function 
  fix      when fixing a bug 
❯ tada     when celebrating
(Move up and down to reveal more choices)
# subjectは聞かれない
```

またsubjectは特別に`-m`のaliasがついているのでgit aliasと組み合わせるとこんなふうになります。

```bash
$ git config --global alias.con "consistent -i"

$ git con -m "this is amazing commit"
? Select type: 
❯ feat     when implementing function 
  fix      when fixing a bug 
  tada     when celebrating
(Move up and down to reveal more choices)
```

普段コミットしているときとほぼ同じ使い方ですね。

## 応用

応用として以下のような機能があります。

- 入力を装飾する 例) `test`と入力すると`【test】`になる
- フォーマットチェック
  - はじめの文字の大文字/小文字
  - 末尾のdot (`.`)
  - 日本語許可
- コミットメッセージにブランチ名の一部を含める 例) `issue-123`というブランチでコミットしたときに`close #123`を自動的にコミットに入れる
- スペルチェック
- 絵文字サポート
- [git-duet](https://github.com/git-duet/git-duet)サポート

これらは`.gitcommit_template`と`.git_consistent`を自由に編集することでかんたんに使うことができます。

詳しくは[README](https://github.com/isuke/git-consistent/blob/master/README.adoc)および[サンプルリスト](https://github.com/isuke/git-consistent/blob/master/README.adoc#samples)を参照ください。

あなたのプロジェクトに秩序があらんことを！