You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac Monterey系统下pre-commit Git钩子无法运行求助

Mac Monterey 下 Git pre-commit 钩子不触发解决步骤

按以下优先级排查,覆盖该系统环境下90%以上的同类故障:

1. 优先检查Git钩子路径配置

这是该问题最高频的诱因:如果Git全局或当前仓库配置了core.hooksPath参数,Git会完全忽略默认的.git/hooks目录,只去你配置的自定义路径下查找钩子文件,你放在.git/hooks里的文件根本不会被读取。
执行以下命令检查配置:

# 查看全局钩子路径配置
git config --global --get core.hooksPath
# 查看当前仓库的钩子路径配置
git config --local --get core.hooksPath
  • 若任意一条命令返回非空路径,你有两个选择:要么把pre-commit钩子文件移动到返回的对应路径下,要么执行对应作用域的unset命令恢复默认配置:
    # 清除全局自定义钩子路径
    git config --global --unset core.hooksPath
    # 清除当前仓库自定义钩子路径
    git config --local --unset core.hooksPath
    

2. 手动验证钩子文件可独立运行

不要等git commit触发,直接在仓库根目录手动执行钩子文件,快速定位文件本身的问题:

.git/hooks/pre-commit
# 查看上一条命令的返回码
echo $?
  • 如果返回Permission denied,说明可执行权限没配置正确,不要用通配符批量加权限,直接给目标文件加权限:chmod +x .git/hooks/pre-commit。
  • 如果执行无任何输出、返回码为127,重点排查两个问题:
    • 换行符格式错误:执行file .git/hooks/pre-commit,如果输出包含with CRLF line terminators,说明文件是Windows格式的CRLF换行,shebang行末尾会多一个不可见的回车符,系统会把解释器识别为不存在的路径,直接跳过执行。直接执行dos2unix .git/hooks/pre-commit,或者用Vim打开后输入:set ff=unix保存,转成Unix的LF换行格式即可。
    • shebang格式错误:钩子文件第一行必须严格是解释器声明,前面不能有空行、不能有其他字符。Monterey环境下不要用/usr/bin/env的写法绕路径(容易受环境变量加载顺序影响找不到解释器),直接用绝对路径#!/bin/zsh作为第一行即可,注意不要在shebang前面加注释,第一行必须是有效声明。

3. 排查系统权限拦截

Monterey的沙盒权限机制会拦截未授权程序访问.git目录下的可执行文件,且不会抛出明确报错:

  • 打开「系统设置 → 隐私与安全性 → 完整磁盘访问」,给你正在使用的终端(系统自带Terminal/iTerm2)、Git GUI客户端勾选权限。
  • 如果是用VS Code、SourceTree这类GUI客户端提交,注意GUI启动时不会加载你shell的自定义环境变量,/usr/bin/env写法的shebang大概率找不到对应解释器,换成前面说的绝对路径shebang即可。

4. 排查钩子内部逻辑提前退出

如果手动执行钩子能正常运行,但git commit时看不到你预设的逻辑输出,先打开pre-commit文件,在shebang下面加一行测试代码:

echo "===pre-commit hook triggered==="

再执行git commit,如果能看到这行输出,说明钩子其实已经正常触发了,是你写的内部逻辑存在提前退出的分支:比如加了set -e严格模式时某条命令报错直接退出,或者逻辑分支判断后直接执行exit 0,Git只要收到钩子返回的0状态码就会认为校验通过,继续走提交流程,不会额外抛错。


内容的提问来源于stack exchange,提问作者l-zep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:27:33