Git pre-commit hook 不生效是怎么回事?

极客璐莹 阅读 50

我按照教程在项目根目录的 .git/hooks/pre-commit 里写了脚本,也加了执行权限(chmod +x),但每次 commit 都直接跳过了,根本没运行。是不是路径放错了?还是 Git 版本的问题?

我的脚本内容很简单,就是想跑一下 ESLint:

#!/bin/sh
echo "Running pre-commit check..."
npx eslint src/
if [ $? -ne 0 ]; then
  echo "ESLint failed!"
  exit 1
fi
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
可歆
可歆 Lv1
首先你要确认 .git/hooks 目录下的钩子文件权限确实设置正确了,但有时候问题不在这。让我一步一步帮你排查。

先说原理,Git 的钩子机制其实很简单:当执行特定 Git 操作时(比如 commit),Git 会查找对应目录下的钩子脚本并执行它。但有几个常见陷阱需要注意。

第一件事是检查你的钩子路径。没错,应该放在 .git/hooks/pre-commit 这个位置,而且要用相对路径写法。不过这里有个更好的建议:把钩子放到项目代码里,用 .husky 或类似工具管理。这样能保证团队成员都能使用相同的钩子配置。

来看你的具体问题。虽然你设置了执行权限,但要注意 Git 钩子必须是可执行的 shell 脚本,并且要有正确的 shebang 行(也就是 #!/bin/sh)。这部分你已经做对了。

我怀疑可能是 ESLint 命令执行失败导致的问题。可以试试修改你的脚本,在运行 npx 命令前加上调试输出:

#!/bin/sh
echo "Running pre-commit check..."
echo "Current working directory: $(pwd)"
npx eslint src/
if [ $? -ne 0 ]; then
echo "ESLint failed!"
exit 1
fi


这个改动会在执行 ESLint 前输出当前工作目录,帮你确认是不是路径问题。有时候 Git 钩子执行的工作目录和你想的不一样。

另外记得检查一下 npx 命令能不能在项目根目录正常运行。可以在终端手动执行一次 npx eslint src/ 看看有没有报错。

要是这些都没问题,那可能真跟 Git 版本有关。有些老版本 Git 对钩子支持不太好。这种情况下可以考虑升级 Git 或者换用第三方工具来管理钩子。

最后提醒一句,调试钩子最烦人的是它不直接显示错误信息。多加点调试输出总是没错的,省得抓狂。我自己也被这事儿坑过好几次。
点赞
2026-03-27 09:00