我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
当前回答
对于Node.js用户来说,一个简单的解决方案就是更新包。json和
{
"name": "name",
"version": "0.0.1",
......
"scripts": {
"preinstall": "git config core.hooksPath hooks",
preinstall将在之前运行
npm安装
并重定向Git以查找。\hooks(或任何您选择的名称)目录中的钩子。这个目录应该模仿。\。Git \挂钩在文件名(减去.sample)和结构方面。
设想Maven和其他构建工具将具有与预安装相当的功能。
它还应该适用于所有平台。
如果需要更多信息,请参阅与团队共享Git钩子的两种方法。
其他回答
我们使用的Visual Studio解决方案(以及项目)具有构建前和构建后事件。我正在添加一个名为“GitHookDeployer”的额外项目。项目在生成后事件中自我修改文件。该文件被设置为复制到构建目录。因此,项目每次都被构建,并且从未被跳过。在构建事件中,它还确保所有git钩子都到位。
请注意,这不是一个通用的解决方案,因为有些项目当然没有任何东西要构建。
如果遵循示例文件,理想情况下,钩子是用Bash编写的。但是您可以用任何可用的语言编写它,只要确保它具有可执行标志。
因此,您可以编写Python或Go代码来实现您的目标,并将其放在hooks文件夹下。它可以工作,但不能与存储库一起进行管理。
两个选项
a)多脚本
你可以在帮助中编写钩子的代码,并在钩子中添加一小段代码,以调用你的完美脚本,如下所示:
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js
b)单一脚本
一个更酷的选择是只添加一个脚本来管理所有脚本,而不是多个脚本。你创建了一个hooks/mysuperhook。去文件和指向每一个钩子你想要它。
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)
参数将为你的脚本提供哪个钩子被触发,你可以在你的代码中区分它。为什么?例如,有时您可能希望对提交和推送执行相同的检查。
然后呢?
然后,你可能想要更多的功能,比如:
Trigger the hook manually to check if everything is OK even prior to a commit or push. If you just call your script (option a or b) would do the trick. Trigger the hooks on CI, so you don't need to rewrite the same checks for CI. It would be just calling the commit and push triggers, for instance. The same as the above should solve it. Call external tools, like a markdown validator, or a YAML validator. You can make syscalls and need to handle standard output and standard error. Make sure all developers have a simple way to install the hooks, so a nice script needs to be added to the repository to replace default hooks with the correct ones Have some global helpers, like a check to block commits to develop and master branches, not having to add it to every repository. You can solve it by having another repository with global scripts.
还能简单点吗?
是的,有几个工具可以帮助您管理Git钩子。每一种方法都是从不同的角度解决问题,您可能需要了解所有方法,才能找到最适合您或您的团队的方法。GitHooks.com提供了大量关于“钩”的阅读资料,以及目前可用的一些工具。
到目前为止,这里列出了21个使用不同策略管理Git钩子的项目。有些只针对单个钩子,有些针对特定的语言,等等。
其中一个由我编写并作为开源项目免费提供的工具叫做hooks4git。它是用Python编写的(因为我喜欢它),但其思想是在一个名为.hooks4git.ini的配置文件中处理上面列出的所有项,该配置文件位于存储库中,可以用任何语言调用您想调用的任何脚本。
使用Git钩子绝对很棒,但是提供它们的方式通常只会让人们远离它。
理论上,您可以在项目目录中创建一个包含所有脚本的hooks目录(或任何您喜欢的名称),然后将它们符号链接到.git/hooks中。当然,克隆该回购的每个人都必须设置这些符号链接(尽管您可以有一个非常出色的部署脚本,克隆程序可以运行该脚本半自动地设置它们)。
要在*nix上执行符号链接,你所需要做的就是:
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
如果您准备覆盖.git/hooks中的内容,请使用ln -sf
要对hooks目录进行版本化(假设它存储在hooks/中),在工作副本根目录下创建一个.gitconfig文件,包含以下内容:
[core]
hooksPath = hooks
它将覆盖.git/config。
大多数现代编程语言,或者说它们的构建工具,都支持插件来管理Git钩子。这意味着您所需要做的就是配置您的包。Json, pom.xml等文件,团队中的任何人都没有选择,除非他们更改构建文件。
该插件将为您添加内容到.git目录。
例子:
Git构建钩子Maven插件
githook-maven-plugin
git-hooks-js