为整个团队创建全局预提交挂钩

20
如何创建一个全局的 pre-commit 钩子,让团队中的每个人都可以使用? 基本上,我希望无论谁克隆远程仓库,他都应该默认获取这个全局 pre-commit 钩子。
我看到了这个问题:change default git hooksGit commit hooks - global settings以及这个https://coderwall.com/p/jp7d5q,其中建议创建一个模板目录,拥有通用钩子,并设置 init.templatedir 指向该目录。但是,这仅适用于在自己的机器上为自己设置默认钩子。如何使 pre-commit 钩子默认对整个团队可用?

你唯一能完成这个任务的方法就是让人们已经设置好了这个基础设施的账户(但他们随时可以删除它)。 - Chris Hayes
3个回答

18

幸运的是,没有一种方式可以在clone时强制钩子(hooks)应用到人们身上。

如果有这样的方式,你可以编写一个post-receive钩子,并在其中加入rm -rf /来清空人们的硬盘。

你可以设置一个命令来自动安装本地仓库的钩子。有一些软件包像husky简化了这个任务。基本上,你可以在仓库中进行配置,然后要求人们在克隆仓库后立即运行npm i,从此以后他们将使用你在仓库中指定的钩子。

然而,你只应该与你信任的人这样做,因为一旦你使用npm i命令安装钩子,就会暴露自己受到上述攻击的风险。


15
如何默认使整个团队都可以使用pre-commit钩子?
这是不可能的,正如我在“Git中pre-push和pre-receive hook之间的区别?”中所解释的那样。
从安全角度来看,这将非常可怕 - 没有人应该有能力强制我在运行某些git命令时执行某些脚本。
因此: 无论如何,请记住 git commit --no-verify绕过 预提交钩子。
这就是为什么服务器端的钩子更安全(如 "Difference between pre-push and pre-receive hook in git?" 中所讨论的),并且将捕获所有推送到受保护存储库的不良提交。
这并不意味着预提交钩子是无用的:如果您能说服用户激活它,它将有助于更早地捕获错误,这是一件好事。
但它无法 "自动" 强制执行。

谢谢澄清我的概念。我明白预接收钩子会是我使用情况的更好选择。我对全局预提交钩子感到好奇,因为“它将帮助更早地捕获错误,这是一件好事”。 - phoenix

6
"

https://github.com/rycus86/githooks是管理钩子的很好的选择

它是...

  1. 安全的(它使用自愿模型,在运行新脚本或更改脚本时会要求确认是否运行或禁用)
  2. 可配置的
  3. 处理许多细节
  4. 让您保持钩子的良好组织。例如:
"
/
└── .githooks/
    └── commit-msg/
        ├── validate
        └── add-text
    └── pre-commit/
        ├── 01-validate
        ├── 02-lint
        ├── 03-test
        ├── docs.md
        └── .ignore
    └── post-checkout
    └── ...
    └── .ignore
    └── .shared
    └── .lfs-required
├── README.md
├── LICENSE
└── ...

1
我不确定为什么这个没有任何赞; 看起来是一个很好的解决方案。 - CrazyPyro

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