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

327

我编写了一个Git post-commit钩子并且它能够正确工作。但是,我想将此钩子添加到我正在工作的所有现有(和未来的)Git仓库中。

我尝试将钩子添加到~/.git/hooks/目录而不是项目目录中的hooks目录中,然而这似乎没有起作用。

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


6
自 Git 2.9 版本起,最佳实践已经发生了变化:VonC 的回答更可靠。https://dev59.com/hHE95IYBdhLWcg3wft1w#37293198 - Simon Brahan
这个回答解决了你的问题吗?更改默认的Git钩子 - Oliver Sieweke
“项目目录”可能是GitLab的术语(指存储库根目录)。 - Peter Mortensen
4个回答

317
从 Git 1.7.1 开始,你可以在 gitconfig 中设置 init.templatedir,告诉 Git 模板文件的路径。点击此处了解更多信息。
设置方式如下:
git config --global init.templatedir '~/.git_template'

以后,您创建或克隆的新存储库将使用此目录作为模板。将您想要的挂钩放在 ~/.git_template/hooks 中。通过在与 .git 目录相同的目录中运行 git init,可以使用适当的模板重新初始化现有的存储库。
对于 Git 版本旧于 1.7.1 的情况,如果您像我一样仍然想管理您的 .git_template 目录以及其他 dot 文件,则运行 git init --template ~/.git_template 将起作用。您还可以使用 $GIT_TEMPLATE_DIR 环境变量告诉 git init 模板目录的位置。

67
好的回答。如果有人想知道在现有仓库上重新运行 git init 是否会清空它 - 不会,参见:https://dev59.com/L2435IYBdhLWcg3w50f4 - kontur
2
提醒一下,使用该命令时不会自动为您创建~/.git_template。您仍然需要使用mkdir ~/.git_template手动创建它。 - Geuis
2
在Windows上,不需要引号:git config --global init.templatedir d:\git\.git_template\ - Vladimir Vukanac
2
提示:模板挂钩被复制了。如果您希望能够一起更新全局挂钩,请将挂钩放在其他地方,并在模板目录中添加符号链接(在Linux上)。确保链接路径是绝对的。 - Tim Allclair
1
运行 git init 实际上没有为我更新钩子。看起来它不会覆盖已经存在的文件。相反,您需要先删除旧的钩子文件。stackoverflow.com/questions/10791486/ - Phil R
显示剩余9条评论

289

我希望将这个钩子添加到我正在使用的所有当前和未来的git仓库中。

对于git 2.9+ (2016年6月)及以上版本,你只需要执行以下操作:

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

参见"更改默认的git hooks":这样做是为了管理集中式的hooks。


如果我有一个现有的代码库,并且希望所有拉取更改的其他开发人员都拥有更新的 pre-commit 钩子,我该如何做到这一点?谢谢。 - Richlewis
2
@Richlewis,您的意思是https://dev59.com/Dpzha4cB1Zd3GeqPEmrP#40550555不够清晰吗? - VonC
@Richlewis,您需要设置一个共享文件夹,使所有开发人员都可以访问,在他们自己的本地配置中引用。 - VonC
不幸的是,我仍然不太明白。在存储库中有 /.git/hooks/pre_commit,我可以将其指向那里吗? - Richlewis
@Richlewis 我已经在你的原始问题上回答了你。 - VonC

73
如果您希望在系统的各个地方(包括除了您之外的用户)都使用它们,您可以修改已安装模板目录的内容-这些目录在$PREFIX/share/git-core/templates/hooks中,其中$PREFIX可能是/usr/local或者/usr
如果您只想自己使用它们,那么最简单的方法就是使用git-init的--template选项。您可以轻松地维护一个个人模板目录,其中包含回到您想要保留的默认设置的已安装版本的符号链接(各个钩子,信息目录...),然后在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
2
对于 Windows 系统,这个文件可以在 git 安装目录下的 mingw64\share\templates\hooks(或者 32 位系统下的 mingw32)找到。 - nerdherd
1
@nerdherd,现在它位于mingw64\share\git-core\templates\hooks(gfw 2.25)。 - RJFalconer
答案提到“安装模板目录的内容 - 这些在 $PREFIX/share/git-core/templates/hooks 中”,那么这是否适用于本地 GitHub 实例,以便我们组织中的所有存储库都可以获得钩子? - Max Cascone

5
一种极简的方法是在你的存储库中创建一个git_hooks/目录来跟踪你为该项目编写的挂钩,通过在README中提及它来引起未来用户的注意,并依赖于他们在克隆后采取正确的操作。我思考了一段时间,并选择了增量方法。未来我可能会考虑使用像git-hooks这样的工具。

7
很抱歉,这个解决方案离真正的解决方案还有很大的差距,我不得不投反对票。 - Victor Schröder
链接已损坏 - DrBeco
链接已损坏。 - undefined

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