我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
当前回答
如果遵循示例文件,理想情况下,钩子是用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钩子绝对很棒,但是提供它们的方式通常只会让人们远离它。
其他回答
对于Gradle用户
我发现这些脚本对于Gradle项目非常有用。
build.gradle
从:rootProject.file('gradle/install-git-hooks.gradle')
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
在Git 2.9中, 配置选项核心。hooksPath指定自定义钩子目录。
将钩子移动到存储库中的钩子跟踪目录。然后,配置存储库的每个实例来使用跟踪的钩子,而不是$GIT_DIR/hooks:
git config core.hooksPath hooks
通常,路径可以是绝对的,或者相对于钩子运行的目录(通常是工作树的根;参见man githooks的描述部分)。
使用git-hooks。它将.git/hooks调用路由到项目目录githooks下的脚本中。
还有很多功能,使您能够最大限度地减少复制和符号链接钩子到处。
对于Node.js用户来说,一个简单的解决方案就是更新包。json和
{
"name": "name",
"version": "0.0.1",
......
"scripts": {
"preinstall": "git config core.hooksPath hooks",
preinstall将在之前运行
npm安装
并重定向Git以查找。\hooks(或任何您选择的名称)目录中的钩子。这个目录应该模仿。\。Git \挂钩在文件名(减去.sample)和结构方面。
设想Maven和其他构建工具将具有与预安装相当的功能。
它还应该适用于所有平台。
如果需要更多信息,请参阅与团队共享Git钩子的两种方法。
你可以让你的hooks文件夹成为另一个Git存储库,并将其链接为子模块…
我想,只有当你有很多成员和钩子定期改变时,这是值得的。