预接收挂钩以阻止无验证

pre-receive hook to block no-verify

我是 git 概念的新手。 我试图强制用户使用提供的客户端挂钩(一种在提交前格式化代码的预提交挂钩)。但正如我们所知,可以使用 --no-verify 选项跳过预提交挂钩检查。 我正在尝试在 git 提交中的某处可能创建一个标志,可以在预接收挂钩中检查该标志,如果该标志不存在,则提交将被拒绝。 我从这里找到了在提交消息本身中添加验证令牌的想法: 但这也可以手动添加!

我的问题是,有没有什么方法可以在服务器端的预接收挂钩中检查提交的不可见标志(而不是附加到提交消息)?

由于严重缺乏这方面的文档,一些指示/帮助会很棒!

这是不可能的。无论您在客户端做什么,用户都可以修改并避免使用 --no-verifygit commit-tree,或者只是使用 libgit2 而不是 Git 的工具。这样的工具确实存在,用户可以在他们的系统上使用它作为开发工具的一部分。

进行这些检查的正确位置是在服务器上,在 pre-receive 挂钩中或在您的 CI 系统中,同时进行代码审查。无论如何,您都应该进行代码审查(因为它擅长捕捉错误和安全问题),但您还需要它来确保开发人员不只是删除或禁用 linting 代码。

当您拥有像这样的有效控件时,开发人员将受到激励以确保他们的代码格式正确(或根据需要进行干净的 lints),因为他们不想修复它并推出固定版本的代码。

引用自relevant portion of the Git FAQ

It’s common to try to use pre-commit hooks (or, for commit messages, commit-msg hooks) to check these things, which is great if you’re working as a solo developer and want the tooling to help you. However, using hooks on a developer machine is not effective as a policy control because a user can bypass these hooks with --no-verify without being noticed (among various other ways). Git assumes that the user is in control of their local repositories and doesn’t try to prevent this or tattle on the user.

In addition, some advanced users find pre-commit hooks to be an impediment to workflows that use temporary commits to stage work in progress or that create fixup commits, so it’s better to push these kinds of checks to the server anyway.

我使用的工作流程与上一段中提到的类似,我发现 pre-commit 挂钩由于这些原因令人厌烦,所以我强烈建议您按照建议将其推送到服务器端。