我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。

是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?


当前回答

大多数现代编程语言,或者说它们的构建工具,都支持插件来管理Git钩子。这意味着您所需要做的就是配置您的包。Json, pom.xml等文件,团队中的任何人都没有选择,除非他们更改构建文件。

该插件将为您添加内容到.git目录。

例子:

Git构建钩子Maven插件

githook-maven-plugin

git-hooks-js

其他回答

理论上,您可以在项目目录中创建一个包含所有脚本的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-hook提供集中式解决方案,如date .io。 它有内置的策略,如:

检测和防止秘密的合并。 执行正确的Git用户配置。 强制Jira票集成-在拉请求名称/提交消息中提到票号。

它不会替换所有的钩子,但它可以帮助开发人员使用最明显的钩子,而不必在每个钩子上都安装钩子 开发人员的电脑/回购。

免责声明:我是Datrees创始人之一

如果遵循示例文件,理想情况下,钩子是用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钩子绝对很棒,但是提供它们的方式通常只会让人们远离它。

我目前正在我们的代码库中工作,我遇到了一个名为husky的库,它简化了如何在团队中使用和共享GitHub Hooks。我强烈建议你调查一下。