git commit.template 仅对不带 -m 的交互式提交生效,不强制、不校验、不解析动态内容;需配合 commit-msg 钩子和 CI 校验才能 enforce 规范,且路径配置必须正确(项目级用相对路径、全局用绝对路径),动态内容须由 prepare-commit-msg 钩子实现。

git commit.template 配置只对不带 -m 的交互式提交生效,它不强制、不校验、不填充动态内容——想靠它 enforce 规范,必须搭配 commit-msg 钩子和 CI 校验。
怎么让 git commit 自动加载模板文件
模板文件本身只是纯文本,Git 只在打开编辑器前把它内容写入临时 message 文件。关键在于路径配置是否正确:
- 项目级配置:模板文件必须放在工作区根目录(如
.gitmessage),然后运行git config commit.template .gitmessage——注意是相对路径,不能写成.git/.gitmessage,否则静默失效 - 全局配置:用绝对路径,例如
git config --global commit.template ~/.gitmessage,且该文件需真实存在、有读权限 - 验证是否生效:执行
git commit(不加-m),看编辑器里是否出现你写的模板内容;若没反应,先检查git config commit.template输出路径是否可读
为什么模板里的 $USER 或 $(date) 不会自动展开
Git 原生命令不解析 shell 变量或命令替换,所有内容原样写入。常见错误是把模板写成:
部署一个包含 4 个智能体(agent)的数字孪生平台。在以下情况下使用该技能: 1. 用户希望为物理资产监控与预测性维护等场景搭建数字孪生系统……
# Author: $GIT_AUTHOR_NAME # Date: $(date +%Y-%m-%d)
结果提交信息里真会出现 $GIT_AUTHOR_NAME 字符串。真正可行的动态填充方式只有:
- 用
prepare-commit-msg钩子修改临时 message 文件:它在编辑器启动前触发,能读取当前分支名、merge 信息等上下文 - 钩子脚本必须放在
.git/hooks/prepare-commit-msg,且有可执行权限(chmod +x) - 团队分发时不能靠
git config同步钩子,得用lefthook、husky或自定义 install 脚本统一部署
如何真正 enforce 提交格式(不只是提示)
模板只是降低填写成本,拦不住人删光重写一行 fix bug。强制手段必须分层落地:
-
commit-msg钩子做本地拦截:例如用grep -qE "^(feat|fix|docs):"检查首行,失败则exit 1 - CI 流水线兜底:用
git log -1 --format=%B提取完整 message,再交给commitlint或自定义正则校验 - 避免钩子被绕过:推荐用
core.hooksPath指向项目内githooks/目录,把钩子脚本纳入版本控制,而非直接放.git/hooks/
最容易被忽略的是路径权限和钩子传播——.gitmessage 放错位置、prepare-commit-msg 没 chmod +x、团队成员各自手配钩子却没人同步更新,这些都会让整套规范在实际协作中形同虚设。

















