【问题标题】:How to configure Github repository to reject changes if any commit has an invalid message?如果任何提交包含无效消息,如何配置 Github 存储库以拒绝更改?
【发布时间】:2021-03-28 20:23:08
【问题描述】:

如果任何提交包含无效消息,我希望 Github 拒绝所有 Git 更改。每条消息都应遵循以下模式

<type> <issue>: <message>

例如

feat #28: Support multiple file upload

在哪里

  • type 应该是预定义列表中的现有类型(feat、fix、ci、...)
  • issue 应该是现有的问题编号(如果甚至可以检查)
  • message 的长度应介于 1 到 100 个字符之间

我知道本地运行的 Git 挂钩。所以我可以防止配置预提交挂钩的无效提交。但是可以简单地在本地删除该钩子,强制提交并将该代码推送到 Github。当然,我已经配置了受保护的分支,所以“攻击者”只能破坏他自己的分支。但是我仍然需要自己检查拉取请求中的消息。

最好将 Github 配置为通过智能错误消息拒绝每个更改

  • abc #28: message goes here 被消息拒绝

因为 'abc' 不是有效类型而被拒绝

  • feat #99999: message goes here 被消息拒绝

因为问题不存在而被拒绝

  • feat #28: 被消息拒绝

因为消息为空而被拒绝

如果可能的话,有人知道如何配置这样的“安全”功能吗?

想象一下很多人都在做这个项目,每个人都应该遵守规则。提交消息应该有一个共同的风格,以便阅读提交历史。我知道只有维护者才能直接推送到 repo,但可能会“忘记”规则并创建包含违反规则的提交的推送。

【问题讨论】:

  • FWIW 这类规则非常烦人。例如,想想当标题为 Merge remote-tracking branch 'origin/master' into my-feature-branch 的提交被拒绝时会发生什么。想要实施这样的规则的原因是什么? (请编辑问题以解决)。
  • 您需要 Enterprise 在 GitHub 上运行预接收挂钩:stackoverflow.com/q/10864903/3001761
  • @AD7six 这是个好问题……我没想到。我更新了我的问题
  • 我建议放弃原始问题的细节,而是使用squash and merge PR commits 加上 PR 标题/描述约定(例如:PR 必须引用要批准和合并的问题)。主人的历史将坚持问题中概述的意图,而没有预接收方法的(显着,IMO)缺点。

标签: git github


【解决方案1】:

GitHub 应用程序是 GitHub 的 recommended way

GitHub 应用是 GitHub 生态系统中的 first-class citizens

您可以构建GitHub App 来处理您的特定用例。 GitHub 提供了丰富的 [API] (https://docs.github.com/en/developers/apps/using-the-github-api-in-your-app) 来处理大多数情况。构建 GitHUb 应用程序的最简单方法之一是使用任何现有的知名框架,例如 PROBOT,这是一个基于 nodejs 的框架,非常易于使用。

对于您的情况,您基本上需要:

type:以编程方式检查已存储的所有可能有效types的列表

issue : Get an issue 如果 API 返回 404 Not Found 的响应,则肯定不存在问题。

message :使用List commits on a pull request ,获取提交消息并在您的代码中实现提交消息检查逻辑。

【讨论】:

【解决方案2】:

您可以在 CI 工作中执行此操作。您可以使用这样的脚本自动执行此操作:

#!/bin/sh

echo "Checking commit messages..."
if git log --format="%s" BASE...HEAD | grep -vE '^(feat|fix|ci) #[0-9]+: .{1,100}'
then
    exit 1
fi

您需要指定BASEHEAD,然后如果所有提交都正常,脚本将退出零,如果不正常,脚本将退出零,打印有问题的。如果您想进行更多检查,例如针对有效问题,则需要添加这样的内容,但这应该可以帮助您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2012-09-10
    相关资源
    最近更新 更多