我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
当前回答
灵感来自a3765910对Gradle的回答,但修改为运行每个构建。
将以下内容添加到应用程序的构建中。Gradle(假设你已经创建了你想要保存在源代码控制中的githooks/pre-commit文件):
copy {
from new File(rootProject.rootDir, 'githooks/pre-commit')
into { new File(rootProject.rootDir, '.git/hooks') }
}
其他回答
要对hooks目录进行版本化(假设它存储在hooks/中),在工作副本根目录下创建一个.gitconfig文件,包含以下内容:
[core]
hooksPath = hooks
它将覆盖.git/config。
如果遵循示例文件,理想情况下,钩子是用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。我强烈建议你调查一下。
如果你的项目是一个JavaScript项目,并且你使用npm作为包管理器,你可以使用shared-git-hooks在npm install上强制使用Git钩子。
完全披露:这个包是我写的
灵感来自a3765910对Gradle的回答,但修改为运行每个构建。
将以下内容添加到应用程序的构建中。Gradle(假设你已经创建了你想要保存在源代码控制中的githooks/pre-commit文件):
copy {
from new File(rootProject.rootDir, 'githooks/pre-commit')
into { new File(rootProject.rootDir, '.git/hooks') }
}