为何git commit --no-verify仍执行钩子?求本地配置排查方向
git commit --no-verify仍触发提交钩子的本地配置原因 问题描述
尝试提交一个会触发项目钩子报错的WIP分支,执行命令:git commit --no-verify -a -m "Issue #1149: get past second error"
后,Git仍会运行提交钩子。临时解决办法为:git -c core.hookspath=/dev/null commit -a -m "Issue #1149: get past second error"
使用的Git版本:
$ git version git version 2.39.2 (Apple Git-143)
该问题在VSCode终端和Terminal.app中均会出现。
可能的本地配置原因
commit.template配置关联钩子逻辑
若设置了commit.template,部分自定义提交模板可能附带触发钩子的脚本逻辑,或被钩子脚本强制读取执行,导致--no-verify参数失效。可执行git config --list | grep commit.template检查是否存在相关配置。Git别名覆盖
commit命令
全局或本地仓库的Git配置中,若定义了commit别名(如alias.commit = commit --some-option),可能导致--no-verify参数被忽略或未正确传递。执行git config --list | grep alias.commit查看是否存在此类别名。core.hooksPath被强制设定
全局、本地仓库或系统级配置中,若固定设置了core.hooksPath路径,即使添加--no-verify,Git仍会从该路径加载钩子。执行git config --list --show-origin | grep core.hooksPath可查看配置来源。系统级Git配置强制启用钩子
Apple Git可能带有系统级配置(如/etc/gitconfig),其中可能存在强制启用钩子的设置,或钩子路径被系统配置锁定,导致--no-verify无法跳过钩子。可直接查看系统级配置文件内容确认。钩子脚本忽略
--no-verify标记
部分自定义钩子脚本未正确检查Git传递的GIT_COMMIT_NO_VERIFY环境变量,强制执行逻辑。这种情况虽属于钩子脚本本身问题,但如果本地配置强制加载了这类钩子,也会出现该现象。
内容的提问来源于stack exchange,提问作者David P. Caldwell

