git的预提交和后提交钩子没有运行

41
什么原因会导致我的 git 预提交和提交后挂钩没有运行?
(请注意:此问题不是重复;其他问题的答案是 chmod +x 或“没有文件扩展名”,但这里都不是问题)
它们是可执行的: $ ls -alh .git/hooks/*-commit -rwxr-xr-x … .git/hooks/post-commit -rwxr-xr-x … .git/hooks/pre-commit 以下是它们各自的内容: #!/bin/sh echo "$0 正在运行" exit 1 手动运行它们是可以工作的: $ .git/hooks/pre-commit .git/hooks/pre-commit 正在运行 但它们在提交时未被git执行: $ git commit -am "测试挂钩" [master d17c0f38] 测试挂钩 1 file changed, 1 insertion(+) 这是使用 git 2.16.2。
6个回答

62
例如,我曾经看到将配置core.hooksPath设置为与$GIT_DIR/hooks不同的路径,导致该文件夹中的挂钩被忽略。
检查您的git config core.hooksPath输出,以及更一般的git config -l是否有任何异常设置。
请注意,git commit -n会跳过预提交挂钩
由wolever编辑:
我已将此添加到我的core.hooksPath目录中的脚本中,如果存在则运行存储库的挂钩。
#!/bin/sh
set -eu
hook_name="$(basename "$0")"
hook_script=".git/hooks/$hook_name"
[ -e "$hook_script" ] && "$hook_script"
exit 0

5
没错,就是这样!我之前设置了一段时间,并假设它会与本地挂钩一起运行,而不是代替。你似乎是正确的——如果存在core.hooksPath,那么.git/hooks/就不会被检查(即使core.hooksPath缺少钩子脚本)。 - David Wolever
1
@DavidWolever 做得好。你确实发布了一些具有挑战性的问题! - VonC
假设根本没有 core.hooksPath。但是,你发现运行 git config --list --show-origin 会显示全局配置位置,现在你只想让每个项目始终运行 pre-commit 钩子来执行相同的操作(在我的情况下,如果我忘记了,则运行测试)。我应该在哪里设置全局钩子路径,并如何告诉运行 npm test -- --updateSnapshots 的脚本首先 cd 到特定项目的根目录? - Neil Gaetano Lindberg
1
@NeilGuyLindberg 在哪里:您想要的任何文件夹中,以托管您的钩子,包括 pre-commit 钩子。但是由于它不需要参数,因此您无法找到特定项目的根文件夹。像这样本地安装更安全:https://pre-commit.com/ - VonC
1
这解决了我的问题。我以为 hooksPath 是可添加的。 - martins16321
显示剩余3条评论

18
在我的情况下,projRootDir/.git/config文件中的core.hooksPath设置不正确。从配置文件中删除该条目即可解决问题。

3
这个。只需从本地配置文件中移除hooksPath条目。 - Bruno Cunha

9
在项目(仓库)根目录中执行此命令应该可以解决问题。
git config --local core.hooksPath .git/hooks

1
pre-commit而言,特别是在那个特定的仓库中,预提交钩子没有运行,是因为我只对其进行了pip install pre-commit操作,而没有执行pre-commit install将其安装到.git/hooks/pre-commit中。

0

我想强调一下,如果你对于你的 Git 钩子路径有任何疑惑,可以在终端中打开 Git 钩子文件并运行 pwdcd 命令获取绝对路径,并将其用于你的 hooksPath =


0

请检查您的 Git 版本是否大于 2.9。


请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community
1
无法编辑,但这里缺少的细节是Git 2.9以下版本不支持core.hooksPath。因此,当尝试从非标准位置运行钩子时(因为Git不会告诉您配置选项是否未使用,因此他们可能错误地认为core.hooksPath有效),有人可能会遇到此问题。 - Michael
截至2023年6月,git的版本仅为2.41.0。(请参阅https://github.com/git/git/tags) 您是否使用了不同的git版本或者指定了错误的版本号? - Sue Raisty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接