🌵

LazygitのカスタムコマンドでConventional Commits+Gitmojiをいい感じにする

2023/11/25に公開

TL;DR


こんな感じにカスタムコマンドで、テンプレートに従ったコミットメッセージを書きやすくしました。

はじめに

Gitのコミット、どんなコミットメッセージでするのがいいでしょうか?
世の中にはいろんな流儀があります。

  • Conversational Commitsでfix(class): bug fixみたいにしたり
  • Gitmojiを使って🎉認証機能の追加みたいにしたり

主流なものだと上記みたいなものがあります。

これらのテンプレートはケースバイケースで決めるものだとは思うのですが、1つ言えるのがノールールの世界線では聖鼻毛領域のごときカオスなコミット履歴となるということです。

個人的にはGitmojiがかわいくて好きなのですが、チーム開発をする上では以下のような課題が発生します。

  • Gitmojiがわからないとどの文字を選べばよいのかわからない
  • CLIの表示では:tada:認証機能の追加みたいに表示されて分かりづらい
  • Gitmojiをタイポするとダサくて恥ずかしい

なので、個人的にはConversational Commitsをベースとして、GitmojiやIssue idは任意で末尾につけてもいいよ、くらいが丁度いい気がしてます。
以下みたいな感じですね。

feat(auth): add auth controller🎉(#114)

これらをcommit.templateで当てるものにしてもいいのですが、ちょっと分かりづらいのでLazygitのカスタムコマンドを使ってインタラクティブにコミットメッセージが組めるようにしてみます。

Lazygitとは?

https://github.com/jesseduffield/lazygit

ターミナルUIでGit操作できるツールです。UIがわかりやすく直感的でヘルプコマンドなどもわかりやすいのでおすすめです。

カスタムコマンドを組めたりするのも良いとこですが、以下のプラグインを入れればNeovimでも使えるのが良いとこです...!!!

https://github.com/kdheepak/lazygit.nvim

Telescope.nvimのウィンドウとして表示されます。

カスタムコマンド

カスタムコマンドでこんな感じにしてみました。

emojiの選択の悩み、typoなどが減らせて満足してます。


設定ファイルについて

https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md
リポジトリのdocs配下に丁寧にドキュメントが整備されているので、全部そこに書いてあるのですが、備忘としてざっと書きます。

Lazygitの設定やカスタムコマンドについては、config.ymlで記載をします。
デフォルトのパスとしては、OSによって以下になります。

Linux: ~/.config/lazygit/config.yml
MacOS: ~/Library/Application Support/lazygit/config.yml
Windows: %APPDATA%\lazygit\config.yml

MacOSでは、export XDG_CONFIG_HOME="$HOME/.config"のようにして変更もできるようです。

カスタムコマンドについて

customCommandsとしてyaml形式で記載していきます。
基本形としては、以下のようになります。

customCommands:
  - key: "<c-c>"
    context: "files"
    description: 'commit files with format'
    prompts:
      - type: "input"
        title: "コミットメーセージを入力してね"
        key: "Message"
    command: "git commit --message {{.Form.Message}}"

keyでショートカットキーの設定、descriptionでは、ラベル表示、

contextでは、ショートカットキーが有効になるWhindowを指定できます。以下画像の左側上2つ目のウィンドウにカーソルがある時ですね。

promptsの部分が、実際のユーザー入力の部分です。この部分は多段にもできるので、

  • feat/fix/styleの中から選択してEnter
  • messageを入力してEnter
  • emojiを選択してEnter

みたいにすることができます。

組んでみたテンプレート

選択肢は省略しますが、以下のように書いてます。

customCommands:
  - key: "<c-c>"
    context: "files"
    description: 'commit files with format'
    prompts:
      - type: "menu"
        title: "What kind of commit type is it?"
        key: "Type"
        options:
          - name: "fix"
            description: "バグや不具合の修正"
            value: "fix"
      - type: "input"
        title: "(Optional) Enter the scope"
        key: "Scope"
        initialValue: ""
      - type: "input"
        title: "Enter the Message"
        key: "Message"
        initialValue: ""
      - type: "menu"
        title: "Choise the emoji"
        key: "Emoji"
        options:
          - name: '(empty)'
            description: ''
            value: ''
          - name: ':bug:'
            description: '(fix)🐛バグ修正'
            value: ':bug:'
          - name: ':tada'
            description: '(feat)🎉大きな機能追加'
            value: ':tada:'
          - name: ':sparkles:'
            description: '(feat)✨部分的な機能追加'
            value: ':sparkles:'
      - type: "confirm"
        title: "Commit"
        body: "Commit with the message '{{.Form.Type}}{{.Form.Scope}}: {{.Form.Message}}{{.Form.Emoji}}'. Is this okay?"
    command: "bash -c 'type=\"{{.Form.Type}}\"; scope=\"{{.Form.Scope}}\"; message=\"{{.Form.Message}}\"; emoji=\"{{.Form.Emoji}}\"; commit_message=\"$type${scope:+($scope)}: $message $emoji\"; git commit -m \"$commit_message\"'"
    loadingText: "Commiting..."

  • fix(auth)のscope部分は任意入力
  • emojiの選択で説明を足して迷いづらく

みたいなことが任意で組めるのでやりやすいですね。また、コマンド部分ではシェルワンライナーで職人芸をしたり、シェルファイルの実行結果としたりもできるので自由度はかなり高いです。

まとめ

Lazygitでカスタムコマンドを使ってコミットテンプレートを入力しやすくしてみました。
自由度が高い&Neovim内でも使えるのが良いとこですね。

最後に私のdotfilesを貼っておきます。
https://github.com/glaucus03/dotfiles/blob/main/.config/lazygit/config.yml

参考文献

https://github.com/jesseduffield/lazygit/tree/master
https://github.com/kdheepak/lazygit.nvim
https://www.conventionalcommits.org/en/v1.0.0/

Discussion