Git 钩子:应用 `git config core.hooksPath`

32

我有一个设置了 pre-commit hook 的 git 代码仓库:

my-repo
|- .git
   |- hooks
      |- pre-commit     # I made this file executable

到那时,一切都正常。我提交时挂钩程序运行。

=================================

现在我在my-repo中运行git config core.hooksPath ./git-config/hooks

文件夹结构如下:

my-repo
|- .git
   |- hooks
|- git-config
   |- hooks
      |- pre-commit     # I made this file executable as well

发生的情况是:

  • 新的预提交脚本不会在提交时运行
  • 如果我将旧的预提交脚本留在my-repo/.git/hooks中,则旧的预提交脚本仍然在提交时运行
  • my-repo中运行git config --get core.hooksPath会输出./git-config/hooks

如何使新的预提交钩子在提交时运行?

这里是我显然没有很好理解的文档链接:
https://git-scm.com/docs/git-config
https://git-scm.com/docs/githooks


尝试自己实现 core.hooksPath。默认的钩子是否会与您的自定义钩子一起运行,还是只会运行您的自定义钩子? - Xerri
@Xerri core.hooksPath选项会覆盖默认值(./.git/hooks),因此只有在你指定的新文件夹中的钩子脚本才会被检测和运行。 - Nicolas Marshall
1个回答

45

2
唉,我真不敢相信之前没有检查过!不管怎样,问题已经解决了,我更新了 Git,现在它能够完美地运行。谢谢! - Nicolas Marshall
10
@onmyway133:钩子有点麻烦,因为有大约40亿种方法可以防止它们运行,而Git在任何一种方式阻止时都不会说任何话。因此,您必须枚举所有钩子失败的方式,依次检查每个方式:(1)Git能否找到它? (2)它是否可执行(chmod + x)? (3)它是否真正可执行(如果需要,#!解释器行)? (4)它是否真正真正可执行?(ACL等)... - torek
谢谢@torek,你的评论应该是一个独立的回复,因为它节省了我的时间,我忘记把它设为可执行文件。 - iomv
2
我的hooksPath设置仍然被忽略了...我已经将git更新到2.33版本...我已经创建了从.git/hooks到实际路径的符号链接,但我更希望它能正常工作... - Guian
1
@Guian:所以当符号链接到位时,钩子文件可以工作,但是当通过core.hooksPath引用时,它们就无法工作了?这有点奇怪;请查看任何特定于操作系统的怪异行为,例如限制跨文件系统的exec()等。 (这将高度取决于您的操作系统、ACL等。) - torek

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