也是借着 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 方法,实现内容如下:
- 固定的提交信息格式,如
feat: 添加用户登录功能
。 - 自带 emoji 图标,如
🚀 feat: 添加用户登录功能
。 - 支持自动翻译成日文,如
🚀 feat: 追加ユーザーログイン機能
。
commit message emoji 前缀
- 除了 vscode 可以在设置里设置 emoji 前缀,还可以在 github.copilot.chat.commitMessageGeneration.instructions 里设置。
- 使用 git hook 机制也可以,更通用一点
使用步骤:
每个项目下(说是可以全局设置但是因为 gitmessage 全局配置,然后没有生效的原因,所以每个项目下都要设置)
如果您想根据不同的 commit type 自动匹配不同的 emoji,我们可以通过 Git Hook 来实现:
# 创建或编辑 prepare-commit-msg hook
vim .git/hooks/prepare-commit-msg添加以下内容:
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
{ |
使用 gitmessage.txt 提交模板 (commit message template)
Git 原生就支持自定义提交信息模板,我们可以利用这个功能为 Copilot 提供上下文,让它更加“乖巧”地填充。操作步骤如下:
在项目根目录创建一个
.gitmessage.txt
,并写入你的“理想模板”,比如:# Commit message template (Conventional Commits)
<type>(<scope>): <subject>
<BLANK LINE>
- 这里补充详细描述,原因、方案等
- 支持多行
<BLANK LINE>
BREAKING CHANGE: <如果有破坏性更新则填写,否则删除此行>在你的全局或者项目级
.gitconfig
中加入:git config --global --edit
[commit]
template = .gitmessage.txt这样每次
git commit
时,编辑器会自动加载这个模板。Copilot 也会看到这些“上下文”,更容易给出格式化的建议。提交时同样先在模板上方或合适位置输入一些对本次变更的描述,或者留空让 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 -------------- |
使用方式
- 在项目根目录创建
.gitmessage.txt
文件,并将以上内容粘贴至其中。 - 在全局或项目级
.gitconfig
中添加如下配置:[commit]
template = .gitmessage.txt - 以后执行
git commit
时就会自动调用这个模 a 板文件。 - 根据实际需要,在
<type>(<scope>): <subject>
、-
、BREAKING CHANGE:
等位置填写内容。 - 保存后退出编辑器,即可完成规范化的提交信息。
这样,即使不使用任何额外工具,也能让自己或团队的提交信息更加统一、易读,同时还能在提交阶段通过 Copilot 或其他辅助插件来自动补全、完善这份模板。