Git pre-commit与post-commit钩子未运行排查(已排除权限及扩展名问题)
既然你已经确认钩子有可执行权限、文件名也没有多余扩展名,而且手动运行正常,那咱们来排查几个容易被忽略的可能性:
Git配置指定了自定义钩子路径
Git允许通过core.hooksPath配置项指定钩子文件的存放目录,如果你之前设置过这个值,Git就不会去默认的.git/hooks目录找钩子了。可以运行以下命令检查:git config --get core.hooksPath如果输出了某个路径,要么把你的钩子脚本移到这个指定目录,要么用
git config --unset core.hooksPath恢复默认路径。提交时使用了跳过钩子的参数
如果你提交代码时加了--no-verify(或简写-n)参数,Git会直接跳过pre-commit、commit-msg这类钩子。确认一下你执行提交的命令有没有带这个参数。.git目录本身的权限问题
虽然你能手动运行钩子,但如果.git目录本身没有足够的权限(比如没有读取或执行权限),Git可能无法访问里面的钩子文件。可以检查.git目录的权限:ls -ld .git确保输出的权限包含
rwx(比如drwxr-xr-x),如果权限不足,用chmod 755 .git修正。Git版本兼容性问题
某些非常老旧的Git版本(比如低于2.0)可能存在钩子处理的bug,导致钩子无法被触发。运行git --version检查版本,如果版本过旧,尝试升级到最新稳定版。钩子脚本的shebang行存在隐性问题
你的脚本用了#!/bin/sh,虽然手动运行正常,但如果系统中sh指向的shell与Git运行时使用的shell存在兼容性差异(比如某些环境下sh是dash,而脚本隐含了bash特性),可能导致Git无法正常执行它。可以尝试把shebang改成#!/bin/bash(如果系统有bash),再测试提交。当前工作区是Git子模块
如果你在子模块目录中执行提交,钩子需要放在子模块自己的.git/hooks目录里,而不是父仓库的.git/hooks。确认你操作的仓库对应的钩子目录是正确的。
内容的提问来源于stack exchange,提问作者David Wolever

