【问题标题】:pre-receive hook to block no-verify预接收挂钩以阻止不验证
【发布时间】:2020-08-28 10:57:13
【问题描述】:

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

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

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

【问题讨论】:

  • 一切都可以在客户端进行模拟。唯一的解决方案是在服务器端重复所有检查并根据结果接受或拒绝提交。

标签: git githooks


【解决方案1】:

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

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

当您拥有此类有效的控制措施时,将激励开发人员确保他们的代码格式正确(或干净利落,视情况而定),因为他们不想修复它并推送固定版本的代码。

引用relevant portion of the Git FAQ

尝试使用pre-commit 钩子(或者,对于提交消息,commit-msg 钩子)来检查这些东西是很常见的,如果您是作为一个单独的开发人员工作并希望工具能够帮助您,这非常棒。但是,在开发人员机器上使用钩子作为策略控制并不有效,因为用户可以使用--no-verify 绕过这些钩子而不被注意到(以及其他各种方式)。 Git 假定用户可以控制他们的本地存储库,并且不会试图阻止这种情况或对用户进行攻击。

此外,一些高级用户发现pre-commit 挂钩会阻碍使用临时提交来暂存正在进行的工作或创建修复提交的工作流,因此最好还是将这些类型的检查推送到服务器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2012-06-07
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多