我编写了一个 Git 提交后挂钩,它工作正常。 但是,我想添加此挂钩以应用于我正在处理的所有当前(和未来)Git 存储库。 我尝试将钩子添加到我的
~/.git/hooks/
目录中,而不是项目目录中的 hooks 目录中,但是,这似乎不起作用。
有没有办法创建适用于我系统上所有存储库的全局 Git 挂钩(无需将它们复制到每个项目目录中)? 如果没有,未来最好的解决方案是什么——也许是 git-init 模板?
从 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
您的模板目录在哪里。
我想添加此钩子以应用于我正在处理的所有当前(和未来)git 存储库
使用 git 2.9+(2016 年 6 月),您要做的就是:
git config --global core.hooksPath /path/to/my/centralized/hooks
请参阅“更改默认 git hooks”:这样做是为了管理集中式挂钩。
但是,正如Adam Lindberg在评论中指出的那样:
设置全局钩子路径会禁用存储库中的所有本地钩子!
根据您的用例,这可能是目标,如果您愿意,正如OP所说,“创建将应用于我系统上的所有存储库的全局Git挂钩(无需将它们复制到每个项目目录中)” .
但是,如果您不知道这种副作用,并且仍然想保留一些本地挂钩...设置
core.hooksPath
时,这些挂钩将被忽略。
如果您希望它们在系统中的任何地方(包括除您之外的用户),您可以修改已安装模板目录的内容 - 这些内容位于
$PREFIX/share/git-core/templates/hooks
中,其中 $PREFIX
可能是 /usr/local
或 /usr
。
如果你希望这个适合你,那么是的,最简单的就是 git-init 的
--template
选项。您可以轻松保留一个个人模板目录,其中包含指向您要保留的默认安装版本的符号链接(单独的挂钩、信息目录...),然后在 hooks/post-commit
中保留您自己的内容以及您想要自定义的任何其他内容。
一种极简主义方法是在存储库中创建一个
git_hooks/
目录来跟踪您为该项目编写的钩子,通过在 README
中提及它来引起未来用户的注意,并依靠他们来完成克隆之后是正确的事情。 我对此深思熟虑了一段时间,并选择了渐进的方法。 将来我可能会考虑使用像 git-hooks 这样的工具。