git 通过 commit.template 配置指定提交模板文件,仅对不带 -m 的交互式提交生效;动态内容需用 prepare-commit-msg 钩子实现;模板无强制力,须配合 commit-msg 钩子和 ci 校验 enforce 格式。

怎么让每次 git commit 都自动带模板
Git 本身不强制模板,但通过 commit.template 配置项可以指定一个文件,每次执行 git commit(不带 -m)时,编辑器会默认加载它作为初始内容。
实操建议:
- 在项目根目录建一个
.gitmessage文件(名字任意,但建议带点语义),写好你想要的结构,比如:
feat: <scope>: <subject><footer></footer></subject></scope>
- 运行
git config commit.template .gitmessage(项目级)或git config --global commit.template ~/.gitmessage(全局) - 注意:该配置只对未加
-m的交互式提交生效;加了-m就完全跳过模板 - 路径必须是相对 Git 工作区根目录的路径(项目级配置)或绝对路径(全局配置),相对路径写错会导致静默失效
模板里怎么支持占位符和动态内容
Git 原生命令不解析占位符(比如 $USER 或 $(date)),直接写进去就是纯文本。真要动态生成,得靠 hook 或外部工具介入。
常见错误现象:在模板里写 Author: $GIT_AUTHOR_NAME,结果提交信息里真的出现 $GIT_AUTHOR_NAME 字面量。
可行方案:
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
- 用
prepare-commit-msg钩子预填充内容——它在编辑器打开前触发,能读取当前分支、提交类型等上下文 - 钩子脚本里可以用
sed -i或awk修改临时 commit message 文件,插入时间、Jira ID、当前分支名等 - 注意:钩子需放在
.git/hooks/prepare-commit-msg,且要有可执行权限;团队分发时得用工具(如lefthook或自定义 install 脚本)同步,不能靠git config自动传播
团队统一模板为什么经常“形同虚设”
模板文件本身不会校验格式,也不阻止用户删掉所有内容、只留一行 fix bug。真正起约束作用的是后续流程,不是模板本身。
关键点:
-
commit.template是提示性机制,不是强制机制;它降低填写成本,但不解决规范执行问题 - 想 enforce 格式,必须配合
commit-msg钩子做语法校验(比如检查是否以feat:/fix:开头、是否有空行分隔 header/body) - CI 流水线也得有兜底:即使本地绕过钩子,CI 可用
git log -1 --format=%B提取 message 并用正则验证,不合规就拒绝合并 - 路径配置容易出错:有人把模板放
.git/.gitmessage,但commit.template默认不认.git/下路径,必须写成.git/../.gitmessage或用绝对路径
VS Code / IDE 里模板不生效?检查这三处
很多用户发现配好了 commit.template,但在 VS Code 的源码管理面板里点提交,模板没出来——因为 GUI 工具常绕过 Git 原生命令链。
原因和对策:
- VS Code 默认调用
git commit -m "xxx",不走编辑器流程 → 关闭设置里的git.enableSmartCommit,或手动点「更多操作」→「Commit via CLI」 - JetBrains 系列可能缓存 Git 配置 → 修改完
git config后重启 IDE,或在 IDE 设置里刷新 Git 配置 - 某些终端插件(如 Oh My Zsh 的 git 插件)会覆盖
EDITOR环境变量 → 检查echo $EDITOR是否指向真实编辑器(如code --wait),否则模板文件根本打不开
模板只是起点,真正卡住格式的是 commit-msg 钩子和 CI 规则。没人看守的模板,最后都会退化成空行或 emoji 填充物。










