我们想制作一些我们都可以共享的基本钩子脚本-用于诸如预格式化提交消息之类的事情。Git的钩子脚本通常存储在<project>/.git/hooks/
。但是,当人们进行克隆时,这些脚本不会传播,并且不受版本控制。
有没有一种好的方法可以帮助每个人获得正确的钩子脚本?我可以仅使这些挂钩脚本指向我的存储库中的版本控制脚本吗?
pre-commit
使得预提交挂钩很容易。没有回答OP有关管理任意git钩子的问题,但是预提交钩子可能是最常用于代码质量目的的钩子。
我们想制作一些我们都可以共享的基本钩子脚本-用于诸如预格式化提交消息之类的事情。Git的钩子脚本通常存储在<project>/.git/hooks/
。但是,当人们进行克隆时,这些脚本不会传播,并且不受版本控制。
有没有一种好的方法可以帮助每个人获得正确的钩子脚本?我可以仅使这些挂钩脚本指向我的存储库中的版本控制脚本吗?
pre-commit
使得预提交挂钩很容易。没有回答OP有关管理任意git钩子的问题,但是预提交钩子可能是最常用于代码质量目的的钩子。
Answers:
从理论上讲,您可以hooks
使用所有脚本在项目目录中创建目录(或您喜欢的任何名称),然后在中将它们符号链接.git/hooks
。当然,每个克隆该存储库的人都必须设置这些符号链接(尽管您可能真的很喜欢,并且拥有一个部署脚本,克隆程序可以运行该脚本来半自动设置它们)。
要在* nix上执行符号链接,您需要做的是:
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
使用ln -sf
,如果你准备覆盖什么在.git/hooks
core.hooksPath
用于设置.git之外的文件以链接到hooks文件夹。
在Git 2.9中,配置选项core.hooksPath
指定一个自定义钩子目录。
将您的挂钩移至hooks
存储库中的跟踪目录。然后,将存储库的每个实例配置为使用跟踪hooks
而不是$GIT_DIR/hooks
:
git config core.hooksPath hooks
通常,路径可以是绝对路径,也可以是相对于运行钩子的目录的路径(通常是工作树的根;请参见的说明部分man githooks
)。
如果您的项目是JavaScript项目,并且npm
用作包管理器,则可以使用shared-git-hooks在上实施githooks npm install
。
.git/hooks
。
对于的NodeJS用户一个简单的解决方案是更新的package.json与
{
"name": "name",
"version": "0.0.1",
......
"scripts": {
"preinstall": "git config core.hooksPath hooks",
该预安装将前运行
npm安装
并重定向git在。\ hooks(或您选择的任何名称)目录内查找挂钩。此目录应在文件名(减去.sample)和结构方面模仿。\。git \ hooks。
想象一下,Maven和其他构建工具将具有等同于预安装的功能。
它也应该在所有平台上工作。
如果您需要更多信息,请参见https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/
大多数现代编程语言,或者更确切地说,它们的构建工具,都支持管理git hook的插件。这意味着您只需要配置package.json,pom.xml等,团队中的任何人就别无选择,除非他们更改构建文件。该插件将为您添加内容到.git目录。
例子:
https://github.com/rudikershaw/git-build-hook
理想情况下,如果遵循示例文件,则钩子将以bash编写。但是您可以用任何可用的语言编写它,只需确保它具有可执行标志。
因此,您可以编写Python或Go代码以实现您的目标,并将其放在hooks文件夹下。它将起作用,但是将不会与存储库一起进行管理。
两种选择
a)多脚本
您可以在帮助中编写钩子代码,并在钩子中添加一小段代码,以调用完美的脚本,如下所示:
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js
b)单个脚本
一个更酷的选择是仅添加一个脚本来统治所有脚本,而不是多个脚本。因此,您创建了一个hooks / mysuperhook.go并指向您想要的每个钩子。
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)
该参数将为您的脚本提供触发了哪个挂钩,并且您可以在代码中对其进行区分。为什么?例如,有时您可能想对提交和推送运行相同的检查。
然后?
然后,您可能希望具有其他功能,例如:
这可以更简单吗?
是的,有几种工具可以帮助您管理git-hook。他们每个人都是量身定制的,以从不同的角度解决问题,您可能需要了解所有这些因素,才能找到最适合您或您的团队的东西。GitHooks.com提供了大量有关钩子的信息,并且提供了当今可用的几种工具。
截至今天,这里列出了21个项目,这些项目采用不同的策略来管理git hooks。有些仅针对单个钩子执行此操作,某些仅针对特定语言执行此操作,依此类推。
由我编写并作为一个开源项目免费提供的工具之一称为hooks4git。它是用Python编写的(因为我喜欢它),但是它的想法是在一个名为.hooks4git.ini的配置文件中处理上面列出的所有项目,该文件位于您的存储库中,可以用任何语言调用您要调用的任何脚本。 。
使用git hooks绝对是太棒了,但是提供它们的方法通常只会使人们远离它。
我发现这些脚本对于gradle项目非常有用。
apply from: rootProject.file('gradle/install-git-hooks.gradle')
tasks.create(name: 'gitExecutableHooks') {
doLast {
Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
}
}
task installGitHooks(type: Copy) {
from new File(rootProject.rootDir, 'pre-commit')
into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks
.... your pre commit scripts goes here