检查拉取请求是不是与目标分支保持同步

Posted

技术标签:

【中文标题】检查拉取请求是不是与目标分支保持同步【英文标题】:Check if a pull request is up to date with the target branch检查拉取请求是否与目标分支保持同步 【发布时间】:2017-01-16 15:59:56 【问题描述】:

我们的项目正在使用受保护的分支,并且要求 PR 的基础分支与目标分支保持同步才能合并。我们也在使用 Jenkins 来构建 PR 的未合并头部,因为我们使用的插件会在目标分支发生变化时自动重建所有打开的 PR,这会很快堵塞管道。因此,如果 PR 在没有与目标分支保持同步的情况下打开,我们希望能够立即停止 Jenkins 管道并通知提交者他们需要先合并。

因此,使用 GitHub API,我希望能够判断拉取请求是否与目标分支保持同步。最接近这一点的似乎是拉取请求上的“可合并”属性,但这看起来只表明是否可以完成安全的自动合并,而不是分支是否已经是最新的。

有没有可以直接查看的API json标签?如果没有,是否有一种简单的方法可以使用 git 命令手动检查?

【问题讨论】:

Required Status Checks 可以选择Require branches to be up to date before merging。虽然这不能回答您问题的 API 部分,但它可能是一个值得考虑的有效工作流程。 【参考方案1】:

我不知道 GitHub 是否通过他们的 API 公开了这些信息,但是您可以使用 Git 命令手动检测到这一点。您想找到所谓的合并基础,并确保此提交与 master 的提示相同(或您的主分支是什么)。

以bash 脚本的形式,它看起来像这样:

if [ $(git merge-base @ master) == $(git rev-parse master) ]
then
  echo "Your branch is up to date."
  exit 0
else
  echo "You need to merge / rebase."
  exit 1
fi

如果您将此脚本作为构建步骤包含在内,则退出值应该会导致 Jenkins 在必要时使作业失败。

正如Dmitry's answer 中所述,对于较新版本的 Git,您可以使用 --is-ancestor 标志 git merge-base 将其简化为一个命令。脚本将如下所示:

if git merge-base --is-ancestor master @
then
  echo "Your branch is up to date."
  exit 0
else
  echo "You need to merge / rebase."
  exit 1
fi

【讨论】:

你甚至可以使用 BITBUCKET_PR_DESTINATION_BRANCH 而不是 master 来使其动态化 @Jorge 谢谢,这对 Bitbucket 来说是个不错的选择;大概 GitHub 也有类似的东西。 糟糕,我的错。你说得对,呵呵。【参考方案2】:

有一种现代方法可以做到这一点

git merge-base --is-ancestor A B

见git-merge-base

【讨论】:

【参考方案3】:

如果你想使用 github API。 任何返回拉取请求对象的 API 都将包含 mergeable_state 字段。 如果它的值为behind,则表示在创建拉取请求后更新基础分支。即:拉取请求分支已过期。

这里是mergestatestatus的解释

如果您在 Jenkings 服务器中处理 webhook 响应,大多数拉取请求事件(如拉取请求创建、编辑、关闭或 issue_comment 事件)将在拉取请求对象中包含 mergeable_state 信息。

【讨论】:

【参考方案4】:

对于想要实现合并序列化的工作流的人来说,这是一个非常常见的问题。

这是可以使用Mergify 轻松解决的问题。它通过strict workflow 提供您所需要的一切。 Mergify 负责更新您的过期拉取请求并为您订购有效拉取请求的合并。实际上,我们构建 Mergify 就是为了解决这个问题!

(免责声明:我是 Mergify 的作者之一)

【讨论】:

以上是关于检查拉取请求是不是与目标分支保持同步的主要内容,如果未能解决你的问题,请参考以下文章

Bamboo:创建拉取请求时创建“计划分支”,但按目标分支过滤

显示已在目标分支中的提交的 GitHub 拉取请求

Azure DevOps GIT(gitflow)如何在开发分支上强制执行拉取请求以保持源最新?

Azure DevOps 上的拉取请求以强制替换而不是合并

在发出拉取请求之前,是不是有任何理由将功能分支合并到分叉主控中?

拉取请求与合并请求