将 git post-commit hook 应用到所有当前和未来的存储库

问题描述 投票:0回答:4

我编写了一个 Git 提交后挂钩,它工作正常。 但是,我想添加此挂钩以应用于我正在处理的所有当前(和未来)Git 存储库。 我尝试将钩子添加到我的

~/.git/hooks/
目录中,而不是项目目录中的 hooks 目录中,但是,这似乎不起作用。

有没有办法创建适用于我系统上所有存储库的全局 Git 挂钩(无需将它们复制到每个项目目录中)? 如果没有,未来最好的解决方案是什么——也许是 git-init 模板?

git hook githooks
4个回答
325
投票

从 Git 1.7.1 开始,您可以在 gitconfig 中设置 init.templatedir 来告诉 Git 在哪里查找模板。

这样设置:

mkdir ~/.git_template && \
git config --global init.templatedir '~/.git_template'

之后,您创建或克隆的新存储库将使用此目录作为模板。将您想要的挂钩放在

~/.git_template/hooks
中。通过在
git init
所在的同一目录中运行
.git
,可以使用正确的模板重新初始化现有存储库。

对于 1.7.1 之前的 Git 版本,如果您像我一样并且仍然想管理您的

git init --template ~/.git_template
目录以及其余的点文件,则运行
.git_template
将会起作用。您还可以使用
$GIT_TEMPLATE_DIR
环境来告诉
git init
您的模板目录在哪里。


306
投票

我想添加此钩子以应用于我正在处理的所有当前(和未来)git 存储库

使用 git 2.9+(2016 年 6 月),您要做的就是:

git config --global core.hooksPath /path/to/my/centralized/hooks

请参阅“更改默认 git hooks”:这样做是为了管理集中式挂钩。


但是,正如Adam Lindberg评论中指出的那样:

设置全局钩子路径会禁用存储库中的所有本地钩子!

根据您的用例,这可能是目标,如果您愿意,正如OP所说,“创建将应用于我系统上的所有存储库的全局Git挂钩(无需将它们复制到每个项目目录中)” .

但是,如果您不知道这种副作用,并且仍然想保留一些本地挂钩...设置

core.hooksPath
时,这些挂钩将被忽略。


73
投票

如果您希望它们在系统中的任何地方(包括除您之外的用户),您可以修改已安装模板目录的内容 - 这些内容位于

$PREFIX/share/git-core/templates/hooks
中,其中
$PREFIX
可能是
/usr/local
/usr

如果你希望这个适合你,那么是的,最简单的就是 git-init 的

--template
选项。您可以轻松保留一个个人模板目录,其中包含指向您要保留的默认安装版本的符号链接(单独的挂钩、信息目录...),然后在
hooks/post-commit
中保留您自己的内容以及您想要自定义的任何其他内容。


4
投票

一种极简主义方法是在存储库中创建一个

git_hooks/
目录来跟踪您为该项目编写的钩子,通过在
README
中提及它来引起未来用户的注意,并依靠他们来完成克隆之后是正确的事情。 我对此深思熟虑了一段时间,并选择了渐进的方法。 将来我可能会考虑使用像 git-hooks 这样的工具。

© www.soinside.com 2019 - 2024. All rights reserved.