2010-02-19 146 views
211

我写了一个Git提交后钩子,它工作正常。但是,我想添加这个钩子来应用于我正在处理的所有当前(和未来)git存储库。我尝试将钩子添加到我的~/.git/hooks/而不是在项目目录中的钩子目录中,但是,这似乎不起作用。Git提交钩子 - 全局设置

有没有什么办法可以创建全局的Git钩子,这些钩子将应​​用于我系统上的所有仓库(无需将它们复制到每个项目目录中)?如果不是,那么最好的解决方案是什么 - 可能是git-init模板?

+3

从Git 2.9开始,这个最好的方法已经改变了:VonC的答案是更好的选择。 http://stackoverflow.com/a/372​​93198/2741954 – 2016-06-16 07:41:43

回答

81

我想添加这个钩子应用到我的

使用Git 2.9+(2016年6月)工作的所有电流(和将来)Git仓库,你会做的是:

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

请参阅“change default git hooks”:已完成管理集中挂钩。

+0

如果我有一个现有的回购协议,并希望所有其他的开发人员更改了更新前的提交钩例如,我会如何做到这一点?谢谢 – Richlewis 2016-11-11 15:45:43

+0

@Richlewis你的意思是http://stackoverflow.com/a/40550555/6309不完全清楚? – VonC 2016-11-11 15:47:00

+0

@Richlewis你需要设置一个可供所有开发人员访问的共享文件夹,供他们在自己的本地配置中引用。 – VonC 2016-11-11 15:47:51

67

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

如果你想这样做只是为了你,那么最好的办法就是git-init的--template选项。你可以很容易地保留一个个人模板目录,它的符号链接返回到你想要保留的默认安装版本(单个钩子,info目录...),然后你自己的内容hooks/post-commit以及任何你想要自定义的内容。

+11

谢谢,这工作得很好。为了将其应用到我现有的项目中,我只是再次运行'git init'并添加了新的钩子。 – swanson 2010-02-19 02:33:51

+1

精彩的提示Jefromi,谢谢大家! – 2011-05-10 14:30:44

+0

这是一个整洁的解决方法,但它会要求您更改所有回购。这是可行的,但是插件或其他东西不存在一些可能性(这是如何在Bazaar上完成的)? – 2011-07-16 04:40:57

268

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

设置这样的:

git config --global init.templatedir '~/.git_template' 

之后,新的仓库创建或克隆将使用此目录的模板。把你想要的挂钩放在~/.git_template/hooks。现有的库可以用适当的模板,通过在同一个目录.git处于运行git init重新初始化。

对于除1.7.1较老版本的Git,运行git init --template ~/.git_template如果你像我一样会工作,仍然想管理.git_template dir以及其他点文件。您也可以使用$GIT_TEMPLATE_DIR环境来告诉git init您的模板目录是。

+1

用dotfiles管理git钩子是一个好主意。谢谢。 – 2012-07-19 15:29:52

+47

很棒的回答。如果其他人想知道是否在现有的repo上重新运行'git init'会清除它 - **它不会**,请参阅:http://stackoverflow.com/questions/5149694/does-running-git-init-twice -initialize-a-repository-or-reinitialize-an-existing – kontur 2013-10-10 13:16:25

+0

对于我来说,它并不适用于git模板文件夹的相对路径,以便在现有存储库上使用git init复制文件。我使用完整路径代替。 – user847988 2015-02-16 13:10:20

3

极简主义方法是在您的存储库中创建一个git_hooks/目录,以跟踪您为该项目编写的挂钩,并通过在README中提及该挂钩来引起未来用户的注意,并依靠它们执行正确的操作克隆后的东西。我在这方面思考了一段时间,并选择了一种渐进式方法。在路上,我可能会考虑使用像git-hooks这样的工具。