如何防止使用git commit --no-verify命令?

20
我想为所有的git仓库设置一个pre-commit hook,使用jshint和phplint来验证语法错误。但问题是git有一个功能,可以通过使用--no-verify标志跳过pre-commit hook的执行。但我不需要使用这个选项。请问有没有办法阻止git使用--no-verify标志?请给出建议。

8
我建议使用 CI 测试,例如 TravisCI 来验证内容,而不是尝试在提交钩子中进行部分测试。这种方法无法被规避,可以进行完整的测试,而不仅仅是语法检查。 - Schwern
拉取请求、代码审查和持续集成是前进的道路。话虽如此,钩子prepare-commit-msg可能会很有用。它在提交时也被调用,但不会被--no-verify绕过。然而,请注意,文档中说“它不应该被用作预提交钩子的替代品。”(我不知道为什么。) - tom
无法强制执行预提交挂钩(或任何其他客户端挂钩)。用户始终可以决定不使用它。 - 1615903
2
我认为在开发者决定提交时,过于详细地规定在开发者机器上应该发生什么是一种不好的做法。例如,在js/node领域常用的precommit hook“lint-staged”仍然无法处理部分提交——这是git的一个合法功能。像这里其他人评论的那样,在代码即将被审核并合并到上游时控制linting和测试是一种更好的方法。Precommit hooks可能会引起沮丧。 - timotgl
4个回答

23
首先,你无法确定地阻止某人传递--no-verify选项。话虽如此,使用pre-commit钩子进行linting是一个好习惯,并且没有理由的情况下不要传递--no-verify选项。
但是,如果您想让传递--no-verify选项更加麻烦,可以:
  1. 生成验证令牌并将其附加到pre-commit提交消息中;
  2. 如果缺少或无效,则以非零退出代码退出pre-receive。(在pre-receive钩子中可以执行的示例操作:https://github.com/github/platform-samples/tree/master/pre-receive-hooks
下定决心避免传递 --no-verify的人可能会手动执行步骤1,这也是为什么这种方法不是100%有效的原因。 我不建议在专业环境中设置此项功能,但我支持人们利用手头工具来培养自己的良好习惯,同时学习更多关于git hooks的知识。

1
你可以运行获取验证令牌的代码,并将其用于未使用钩子的自己的提交。这并不能真正防止跳过钩子,试图防止跳过钩子是不好的实践和不良组织文化。不要通过这种控制和居高临下的做法来照顾人们。 - timotgl
4
@timotgl 嗯,当然;你所能做的就是让它任意地变得烦人,以避免钩子。虽然这是一个好观点,但我已经编辑了我的回答,使其更加清晰。顺便说一句,我同意我们不应该监管开发人员,但强烈反对将代码检查留到合并/CI时进行,特别是在团队合作时。代码风格指南尽可能靠近代码编辑位置进行强制执行 - 或者更好的是,使用像Prettier这样的工具进行自动化 - 这样更节省时间、更易用,因此更有可能得到尊重。 - candu
18
“除非你运行我的中间件,否则不应该能够保存你的代码。” 真是个好主意。 - neaumusic
8
这是一个对一个永远不应该被解决的问题的优秀回答。 - Wade Williams

1

Git钩子是客户端验证(类似于前端),如果您想确保验证永远不会被跳过,您需要在CI(后端)上执行它。


说了这么多,以下是我个人对git钩子的意见:在开发人员无法通过代码检查、测试等情况下,禁止合并请求是一种好的实践。 但是应该在CI上执行,而不是过早地在客户端强制执行。这会不必要地减慢开发进度。允许开发人员决定何时修复代码检查问题,而不是说“除非你完美无缺,否则不能提交”。这将使他们专注于解决问题,而不是考虑代码风格标准。

1
如果你的集成开发环境在代码检查通过之前阻止你保存,你会认为这是一件好事吗?阻止用户提交和推送代码等同于在满足一系列条件之前禁止保存。如果开发者的硬盘突然损坏,所有正在进行中的工作都将丢失。
虽然这种预提交模式很流行,但我们要记住它所带来的风险可能是不必要的。这是一个不必要且值得怀疑的做法,可以通过持续集成脚本更好地处理。
(更不用说对于那些经常提交代码的人来说,这样做还会减慢开发速度,因为提交命令需要花费大量时间。)

0

在你的VSCode侧边栏中,前往已安装应用程序的getLens,然后点击设置图标。然后点击“扩展设置”。顶部有一个搜索输入框,只需输入“git”。您将看到“git(81)”。单击它,然后选中“允许不验证提交”复选框。


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