将git post-commit钩子应用于所有当前和将来的仓库


275

我已经编写了一个Git提交后钩子,它可以正常工作。但是,我想添加此钩子以应用于我正在使用的所有当前(和将来)的git存储库。我尝试将钩子添加到~/.git/hooks/项目目录的钩子目录中,而不是添加到我的钩子中,但是,这似乎没有用。

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


3
从Git 2.9开始,最佳方法已经改变:VonC的答案是更好的选择。stackoverflow.com/a/372​​93198/2741954
西蒙·布拉汉

这回答了你的问题了吗?更改默认的git钩子
Oliver Sieweke

Answers:


192

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

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

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

请参阅“ 更改默认git挂钩 ”:已完成此操作以管理集中式挂钩。


如果我有一个现有的仓库,并且希望所有其他进行更改的开发人员拥有更新的预提交钩子,例如,我将如何执行此操作?谢谢
Richlewis

@Richlewis您的意思是stackoverflow.com/a/40550555/6309不太清楚吗?
VonC

@Richlewis您需要设置一个可供所有开发人员访问的共享文件夹,以供他们在自己的本地配置中引用。
VonC

不幸的是我还是不太明白。在仓库中,/.git/hooks/pre_commit我可以指出吗?
Richlewis

@Richlewis我已经回答了您的原始问题。
VonC

290

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

像这样设置:

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模板目录在哪里。


51
好答案。如果有人想知道是否git init在现有回购协议上重新运行会擦除它- 不会,请参见:stackoverflow.com/questions/5149694/…–
kontur

对我而言,它不适用于git template文件夹的相对路径,无法在现有存储库上使用git init复制文件。我曾经使用完整路径。
user847988

1
在不带引号的Windows上:`git config --global init.templatedir d:\ git \ .git_template \
Vladimir Vukanac

1
提示:复制了模板挂钩。如果您希望能够一起更新全局挂钩,请将挂钩放在其他位置,并在模板目录中添加符号链接(在Linux上)。确保链接路径是绝对的。
蒂姆·阿克莱尔

1
跑步git init实际上并没有更新我的想法。似乎它不会覆盖已经存在的文件。stackoverflow.com/questions/10791486/。相反,您需要先删除旧的挂钩文件。
Phil R

69

如果你希望他们无处不在您的系统(包括除了你的用户),您可以修改已安装的模板目录的内容-这些都在$PREFIX/share/git-core/templates/hooks,那里$PREFIX可能是/usr/local/usr

如果您只想这样做,那么是的,最简单的--template选择是git-init。您可以轻松地保留一个个人模板目录,该目录的符号链接指向您想要保留的默认安装版本(各个钩子,信息目录...),然后包含您自己的内容hooks/post-commit以及您想要自定义的其他内容。


11
谢谢,效果很好。并将其追溯应用到我的现有项目中,我git init再次运行并添加了新的挂钩。
swanson

这是一个很好的解决方法,但需要您更改所有存储库。这是可行的,但是插件或某种工具(在Bazaar中是这样做的)没有可能吗?
Martin Ueding

2
对于SourceTree在OS X上的嵌入式git,它们位于/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae 2014年

1
对于Windows,可在git install目录mingw64\share\templates\hooks(或32位mingw32)下找到
nerdherd

1
@nerdherd现在在mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer

7

极简主义的方法是git_hooks/在存储库中创建一个目录,以跟踪您为该项目编写的钩子,通过在中提到它,以引起将来用户的注意README,并在克隆后依靠它们来执行正确的操作。我已经对此进行了一段时间的思考,并选择了一种渐进的方法。我可能会考虑使用git-hooks之类的工具。


1
事实如此,很抱歉,我还不能成为一个真正的解决方案。
VictorSchröder19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.