检查 PR 的提交是否都是目标分支的后代

问题描述 投票:0回答:1

在我们的团队中,我们对 PR 有一个要求:在合并之前需要重新调整基础,以实现“半线性历史”。我正在寻找一种自动化的方法来评估此要求(我们知道如何运行脚本作为 GitHub 检查的一部分,但我需要有关进行评估本身的 git 命令的帮助)。现在我们只需要确定是否需要变基。

我们的 PR 目标是:目标分支位于提交

D
,PR 分支位于提交
P

a-b-c-D
       \
        m-n-o-P

因此,当合并 PR 时,历史记录看起来像这样

a-b-c-D---------q-----T-----W
       \       / \   / \   /
        m-n-o-P   r-s   u-v

我们可以阻止从早于 D 的提交中分支出来的 PR(例如

a
b
c
),都可以使用 GitHub 的设置(要求分支保持最新,并使用
git merge-base --is-ancestor
),但有些情况无法预防。

例如,我们可以检测到:PR 从提交

C
分支出来,它是当前目标分支所在的
D
的祖先。在这种情况下,我们希望分支在
D
之上重新建立基础。

a-b-C-D
     \
      m-n-o-P

我正在努力检测何时涉及合并。如本例所示:目标分支 'main' 在提交

X
中,PR 分支
pr_branch
在提交
J
中(在这种情况下
main
可以快进到
J
,但是有一些提交
d
f
不属于该路径
X->z->g->J
)

    (main is here)
         |
a--b--c--X--z
       \     \
        d--f--g--J
                 ^
            (pr_branch is here)

在这种情况下,

git merge-base --is-ancestor
和 github 都没有标记这一点。检测到的合并基数为
X
(通过运行
git merge-base main pr_branch
)。

我想要检查但无法用 git 命令明确表达的是: PR 在以下情况下有效:

  1. pr_branch
    可以从
    main
  2. 快进
  3. main..pr_branch
    范围内的所有提交都是
    main
  4. 的后代

在此示例中,我们可以检查 1,但我不知道如何测试 #2。

运行

git rev-list main..pr_branch
会给我一个提交列表:
J
g
f
d
Z

提交

d
f
应该使 PR 无法通过检查,因为它们不是
main
的后代(当前为
X
)。我可以为使用
git merge-base --is-ancestor
获得的每个提交运行
rev-list
,但我想知道是否有更好或更正确的方法来执行此操作?也许已经存在一个 git 命令而不必编写脚本?

我检查了一些其他问题,例如git merge:强制执行线性历史记录和合并提交,但那里提供的脚本似乎没有检测到这种情况。

我们尝试过但没有捕获到这种情况的 GitHub 中的功能是 使您的拉取请求与基础分支保持同步

git rebase
1个回答
0
投票

检查

main
pr_branch
之间没有合并提交:

# the following list should be empty:
git rev-list --merges main..pr_branch
© www.soinside.com 2019 - 2024. All rights reserved.