Git钩子管理

27

我们在项目中使用自定义的Git钩子。

这些钩子存储在项目的仓库中,当它们发生变化时,每个用户都必须手动将其复制到他的.git/hooks目录中才能获得新版本。这相当不方便。

改进方法之一是将.git/hooks创建为工作树的符号链接。但这意味着每个分支(甚至是用户正在开发的本地特性分支)都应该具有最新版本的钩子。这也不太方便。

您如何解决这个问题?

解决方案: 可以考虑使用 Git 子模块或者 Git 仓库来管理钩子。将钩子放到一个单独的 Git 仓库中,然后将该仓库作为子模块添加到主仓库中。通过这种方式,所有用户都可以轻松地更新钩子,并且它们可以在所有分支上共享和重用。另外,也可以使用自动化工具来帮助用户更新钩子,以减少手动操作的繁琐。
8个回答

14

维护一个单独的存储库来保存您的钩子,然后将其符号链接到该存储库。

我同意,如果Git有内置机制来传播钩子脚本会很好,但它没有。


1
当然,那是一个选项,但这意味着每个开发者早上都需要更新另一个代码库...我想我需要更多的自动化... - Alexander Gladysh
为什么不直接使用符号链接到子文件夹呢? - xeruf

9

1
这个项目在 Github 上看起来有点不活跃,但是在 https://github.com/git-hooks/git-hooks 上有一个更活跃的分支。 - jelford

4

3

Pre-Commit 有很多看起来很有前途的功能:

  • 支持许多语言,并具备插件架构以支持其他语言
  • 能够引导钩子依赖项(与语言相关)
  • 增量应用钩子(仅在提交的更改部分运行钩子)
  • 利用 init.templateDir,因此新检出的 repos 自动安装正确的 hooks
  • 使用环境变量暂时禁用特定的 hook - 不要因为无法运行其中一个 hook 就跳过所有检查

源代码在这里


2

对于基于NodeJS的项目,我建议您查看ghooks


1

您可以将存储库的.git目录作为Git存储库,并向其中添加钩子和其他配置,将objectsrefs等目录和文件(如index)添加到其.gitignore中。此外,您还可以设置一个post-receive钩子来从其源更新元存储库。一旦您完成了初始配置,就可以轻松地拉取更新。

我正在解决细节问题,例如应该在忽略列表中放什么;我将结果保存在this repo的分支中。


0

我们将.git/hooks作为工作树的符号链接。

对于那些需要提交钩子会拒绝的文件的罕见情况,我们使用git commit --no-verify


那个 git commit --no-verify 命令很危险。当你有糟糕的提交时,重新设置基础会很困难。 - Alexander Gladysh
1
@Alexander,git rebase 命令也可以使用 --no-verify 标志。 - Wayne Conrad
谢谢,我错过了它。不过...这是个hack。 :-) - Alexander Gladysh
1
我仍然不明白为什么这很危险。 - Wayne Conrad
不,不再危险了(至少在我第一条评论中的意义上)- git rebase --no-verify应该能解决问题。但是,如果您已经安装了钩子,为什么要绕过它们呢?这意味着钩子不完善,或者您的代码有问题。当然,我同意,在实践中会有无法避免使用--no-verify的情况。 - Alexander Gladysh
1
实际上,这意味着钩子对于共享存储库是正确的,即使在本地分支上工作时,我们也希望尽早进行这些检查。但有时,我们暂时需要将代码检入本地分支,而该分支不符合钩子的要求(通常是“正在进行中”的提交,树中充满了调试代码,而钩子会拒绝它们)。这个分支将被修改通过钩子并重新定位以去除“正在进行中”的提交,在向上推送之前。你说这是hack,我认为有时候你需要将机器的防护罩卸掉并在其中一个齿轮上插入一根棍子。 - Wayne Conrad

0
命令git config core.hooksPath $CUSTOM_GIT_HOOKS_PATH将设置您的钩子路径为所需的文件夹;您可以为多个Git配置此项,并在所有Git中使用相同的钩子脚本。
如果您想要全局钩子配置,请使用以下命令:git config --global core.hooksPath $CUSTOM_GIT_HOOKS_PATH 要在VSCode中管理您的GitHooks,您可以尝试我的扩展GitHooks GitHooks VSCode Marketplace Link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接