0%

自定义 GitHub Copilot 的 Commit Message 格式

也是借着 GitHub Copilot 免费额度的东风,我最近开始尝试自定义 Git 的 Commit Message 格式。这样可以让团队的 Commit Message 更加统一,也方便后续的代码 review 和版本管理。
这里顺带说下,这个东风也是靠着 cursor 等的竞争,而且截止到今天 2024-12-24,自动生成的功能确实离 cursor 差的不是一点点,尤其是上下文的能力。
比如一个变量的修改,width 和 height,如果你改成了 aWidth,基本上 Copilot 只能识别到一行也就是光标行的内容,而 cursor 可以识别到后续三四处的地方,这个差距还是很明显的。更厉害的是,还没移动到紧接着的 height 行,也是改成 aHeight,Cursor 就已经能识别到了,这是代差啊。

目前 GitHub Copilot 并没有提供一个「一键式」的配置项来固定生成某种格式的 commit message,但我们可以通过一些技巧来“引导”Copilot 生成符合预期格式的提交信息。

本文提供的可定制的 commit message 方法,实现内容如下:

  1. 固定的提交信息格式,如 feat: 添加用户登录功能
  2. 自带 emoji 图标,如 🚀 feat: 添加用户登录功能
  3. 支持自动翻译成日文,如 🚀 feat: 追加ユーザーログイン機能

commit message emoji 前缀

  • 除了 vscode 可以在设置里设置 emoji 前缀,还可以在 github.copilot.chat.commitMessageGeneration.instructions 里设置。
  • 使用 git hook 机制也可以,更通用一点

使用步骤:

  1. 每个项目下(说是可以全局设置但是因为 gitmessage 全局配置,然后没有生效的原因,所以每个项目下都要设置)

  2. 如果您想根据不同的 commit type 自动匹配不同的 emoji,我们可以通过 Git Hook 来实现:

    # 创建或编辑 prepare-commit-msg hook
    vim .git/hooks/prepare-commit-msg

    添加以下内容:

    #!/bin/sh

    COMMIT_MSG_FILE=$1
    COMMIT_SOURCE=$2

    # 如果是通过编辑器提交的 commit
    # 先把 if 注释掉,调试半天原来是没有进入这个分支
    # if [ -z "$COMMIT_SOURCE" ]; then
    # 读取当前的 commit 消息
    TEMP_MSG=$(cat "$COMMIT_MSG_FILE")

    # 如果 commit 消息以 emoji 开头,那么不添加 emoji
    [[ $TEMP_MSG =~ ^[^[:alnum:]] ]] && exit 0

    # 根据 commit type 选择对应的 emoji
    case "$TEMP_MSG" in
    "feat"*) EMOJI="✨ ";;
    "fix"*) EMOJI="🐛 ";;
    "docs"*) EMOJI="📚 ";;
    "style"*) EMOJI="💎 ";;
    "refactor"*) EMOJI="♻️ ";;
    "perf"*) EMOJI="⚡️ ";;
    "test"*) EMOJI="🚨 ";;
    "chore"*) EMOJI="⚙️ ";;
    *) EMOJI="🎉 ";;
    esac

    # 将 emoji 添加到消息开头
    echo "$EMOJI$TEMP_MSG" > "$COMMIT_MSG_FILE"
    # fi

    然后添加执行权限:

    chmod +x .git/hooks/prepare-commit-msg

常用的 emoji 对应关系:

  • ✨ (feat): 新功能
  • 🐛 (fix): 修复
  • 📚 (docs): 文档
  • 💎 (style): 格式
  • ♻️ (refactor): 重构
  • ⚡️ (perf): 性能优化
  • 🚨 (test): 测试
  • ⚙️ (chore): 构建/工具

您想使用哪种方式?我可以帮您调整 emoji 的选择或进一步定制模板。

使用 vscode 的配置文件设置

本来是想要定制下提交的 emoji 图标,没想到连翻译也一起搞定了,还是佩服自己😂。
使用 github.copilot.chat.commitMessageGeneration.instructions

{
"github.copilot.chat.commitMessageGeneration.instructions": [
{
// 其他配置 ...

"text": "Please write the commit message in English, and Japanese. In the Japanese part, include furigana (in parentheses) for each kanji, and for any foreign loanwords, write them in katakana followed by the original word in parentheses. For example:修正(しゅうせい)メモリ(memory). This way, the kanji has its corresponding hiragana reading, and the loanword is clearly identified in katakana along with the original term. Finally, Insert the emojis at the beginning of commit message.Please choose emojis according to the Gitmoji guidelines. Each commit message should include the relevant Gitmoji icon that best represents the type of change."
}

],
}

使用 gitmessage.txt 提交模板 (commit message template)

Git 原生就支持自定义提交信息模板,我们可以利用这个功能为 Copilot 提供上下文,让它更加“乖巧”地填充。操作步骤如下:

  1. 在项目根目录创建一个 .gitmessage.txt,并写入你的“理想模板”,比如:

    # Commit message template (Conventional Commits)

    <type>(<scope>): <subject>
    <BLANK LINE>
    - 这里补充详细描述,原因、方案等
    - 支持多行
    <BLANK LINE>
    BREAKING CHANGE: <如果有破坏性更新则填写,否则删除此行>
  2. 在你的全局或者项目级 .gitconfig 中加入:

    git config --global --edit

    [commit]
    template = .gitmessage.txt

    这样每次 git commit 时,编辑器会自动加载这个模板。Copilot 也会看到这些“上下文”,更容易给出格式化的建议。

  3. 提交时同样先在模板上方或合适位置输入一些对本次变更的描述,或者留空让 Copilot 自行猜测,然后让 Copilot 补全。它就会尽量按照模板格式来生成提交消息。

目前 Copilot 不支持在插件里直接“固定”它的输出格式,但通过模板 + 上下文的思路,可以显著提高它生成的提交信息与既定规范的贴合度。

  • 核心思路就是:给 Copilot 提供尽可能清晰、完整的上下文(模板、注释、示例),让它在自动补全时向你期望的方向靠拢。
  • Git 自带的提交模板功能可以很好地为 Copilot 提供“范本”参考。
  • 如果需要更严格的管控,推荐结合 Commitizen / commitlint / husky 等工具来自动化管理。

祝你定制出满意的 Commit Message!

gitmessage.txt 示例

下面给出一个常见的、基于 Conventional Commits 规范的 .gitmessage.txt 示例。将它放在项目根目录,然后在 .gitconfig 中设置 template = .gitmessage.txt,即可在每次执行 git commit 时,自动加载此模板。

# -------------- .gitmessage.txt Example --------------
# NOTE: Remove or comment out these lines in an actual commit,
# or they may appear in the final commit message.
#
# Commit Message Format: <type>(<scope>): <subject>
#
# Possible <type> values include (but are not limited to):
# feat: A new feature
# fix: A bug fix
# docs: Documentation changes
# style: Code formatting (does not affect runtime)
# refactor: Code restructuring without changing functionality
# perf: Performance improvements
# test: Adding or updating tests
# chore: Changes to build process or auxiliary tools
#
# <scope> (optional) indicates the section of the codebase your changes affect,
# e.g., auth, UI, database, etc.
#
# <subject> is a concise description of the change.
# Keep it short and imperative, e.g., "Add user login feature"
#
# Example: feat(login): add user authentication flow
#
# ------------------------------------------------------

<type>(<scope>): <subject>

# Provide an extended description of the changes below:
# ----------------------------------------------------
-

# If this commit introduces a breaking change, add details below.
# Otherwise, remove or comment out the line.
BREAKING CHANGE:

使用方式

  1. 在项目根目录创建 .gitmessage.txt 文件,并将以上内容粘贴至其中。
  2. 在全局或项目级 .gitconfig 中添加如下配置:
    [commit]
    template = .gitmessage.txt
  3. 以后执行 git commit 时就会自动调用这个模 a 板文件。
  4. 根据实际需要,在 <type>(<scope>): <subject>- BREAKING CHANGE: 等位置填写内容。
  5. 保存后退出编辑器,即可完成规范化的提交信息。

这样,即使不使用任何额外工具,也能让自己或团队的提交信息更加统一、易读,同时还能在提交阶段通过 Copilot 或其他辅助插件来自动补全、完善这份模板。