Open6

Conventional Commits に従ったコミットメッセージを簡単に書く方法を模索する

anfangdanfangd

Conventional Commits に従ったコミットメッセージをいかに手間を減らして書くかを試行錯誤します。

Background

  • 普段は手打ちでコミットメッセージを書いている
  • 基本的には手癖で書けるが、関連する絵文字を忘れがち
  • いい感じのツールがあるならそれを使ってチームにも紹介したい
  • streamich/git-cz が一番いい感じだけど、 scope が手入力できないのがモヤりポイント

Goal

  • 次のような Conventional Commits に従ったコミットメッセージを楽に書くことができること。
  • <description> の冒頭には <type> と関連付けられた絵文字を記載する
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Option

npm

  1. commitizen/cz-cli + leoforfree/cz-customizable
  2. commitizen/cz-cli + withblocks/cz-customizable
  3. commitizen/cz-cli + streamich/git-cz
  4. commitizen/cz-cli + ngryman/cz-emoji
  5. [commitizen/cz-cli + ]Zhengqbbb/cz-git

fish

  1. oh-my-fish/plugin-expand
  2. fish shell+peco

Rus

  1. k3ii/git-cz: A simple commitizen written in rust

Conclusion

次の組み合わせが良さそう

anfangdanfangd

感想

  • 似たような名前、似たような機能が沢山あって迷った
  • ChatGPT に相談しながら作業したけど惑わされただけだった
anfangdanfangd

cz-git

Install

cf. Getting Started | cz-git

npm install -g cz-git commitizen
echo '{ "path": "cz-git", "$schema": "https://cdn.jsdelivr.net/gh/Zhengqbbb/cz-git@1.11.0/docs/public/schema/cz-git.json" }' > ~/.czrc

Configuration

~/.commitlintrc.json
{
  "rules": {

  },
  "prompt": {
    "alias": { "fd": "docs: fix typos" },
    "messages": {
      "type": "Select the type of change that you're committing:",
      "scope": "Denote the SCOPE of this change (optional):",
      "customScope": "Denote the SCOPE of this change:",
      "subject": "Write a SHORT, IMPERATIVE tense description of the change:\n",
      "body": "Provide a LONGER description of the change (optional). Use \"|\" to break new line:\n",
      "breaking": "List any BREAKING CHANGES (optional). Use \"|\" to break new line:\n",
      "footerPrefixesSelect": "Select the ISSUES type of changeList by this change (optional):",
      "customFooterPrefix": "Input ISSUES prefix:",
      "footer": "List any ISSUES by this change. E.g.: #31, #34:\n",
      "generatingByAI": "Generating your AI commit subject...",
      "generatedSelectByAI": "Select suitable subject by AI generated:",
      "confirmCommit": "Are you sure you want to proceed with the commit above?"
    },
    "types": [
      { "value": "feat", "name": "feat:     ✨ A new feature", "emoji": "✨" },
      { "value": "fix", "name": "fix:      🐛 A bug fix", "emoji": "🐛" },
      { "value": "docs", "name": "docs:     📝 Documentation only changes", "emoji": "📝 " },
      { "value": "style", "name": "style:    💄 Changes that do not affect the meaning of the code", "emoji": "💄" },
      { "value": "refactor", "name": "refactor: ☘️ A code change that neither fixes a bug nor adds a feature", "emoji": "☘️" },
      { "value": "perf", "name": "perf:     ⚡️ A code change that improves performance", "emoji": "⚡️" },
      { "value": "test", "name": "test:     ✅ Adding missing tests or correcting existing tests", "emoji": "✅" },
      { "value": "build", "name": "build:    📦️ Changes that affect the build system or external dependencies", "emoji": "📦️" },
      { "value": "ci", "name": "ci:       🎡 Changes to our CI configuration files and scripts", "emoji": "🎡" },
      { "value": "chore", "name": "chore:    🔨 Other changes that don't modify src or test files", "emoji": "🔨" },
      { "value": "revert", "name": "revert:   ⏪️ Reverts a previous commit", "emoji": "⏪️" }
    ],
    "useEmoji": true,
    "emojiAlign": "center",
    "useAI": false,
    "aiNumber": 1,
    "themeColorCode": "",
    "scopes": ["git","github","terraform","docker","script"],
    "allowCustomScopes": true,
    "allowEmptyScopes": true,
    "customScopesAlign": "bottom",
    "customScopesAlias": "custom",
    "emptyScopesAlias": "empty",
    "upperCaseSubject": false,
    "markBreakingChangeMode": false,
    "allowBreakingChanges": ["feat", "fix"],
    "breaklineNumber": 100,
    "breaklineChar": "|",
    "skipQuestions": [],
    "issuePrefixes": [{ "value": "closed", "name": "closed:   ISSUES has been processed" }],
    "customIssuePrefixAlign": "top",
    "emptyIssuePrefixAlias": "skip",
    "customIssuePrefixAlias": "custom",
    "allowCustomIssuePrefix": true,
    "allowEmptyIssuePrefix": true,
    "confirmColorize": true,
    "minSubjectLength": 0,
    "defaultBody": "",
    "defaultIssues": "",
    "defaultScope": "",
    "defaultSubject": ""
  }
}

anfangdanfangd

git-cz

  • スゴく良い
  • scope が選択式でしか入力できないのだけ悩みポイント