Bitbucket 服务器 API:正在查找分支的 merge-base

Bitbucket server API: Finding a branch's merge-base

总结

Bitbucket server(不是 Cloud)API 是否提供与 git merge-base branch1 branch2 相同的功能来查找两个分支的共同祖先?

详情

我们想使用 Bitbucket API 来确定功能分支何时“太旧”,即尚未从 master 或其他主要分支(开发、发布等)重新建立或合并到) 一段时间-比如一周。我看到以下 REST 端点

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=release/1.2.3&until=bugfix'

这可以在上面的示例中给出所有提交 not on release/1.2.3。在重新设置分支的情况下,这很好——我只找到最旧的 branch-specific 提交,它的 parent 是 merge-base.

然而,有些人确实合并提交以更新功能分支(例如 git merge release/1.2.3 在功能分支上),我能想到的最好的是:

  1. 解析 Merge branch 'release/1.2.3' of <repo> into bugfix 的提交消息,这看起来很脆弱,因为有人可能会重写合并提交消息
  2. 找到最近的有两个 parent 的提交,取第二个(似乎是源分支),在源分支上寻找它,如果找到,将其作为基础确定共同祖先的年龄。

也许找到合并基础的解决方法是检查 release/1.2.3 的历史:

如果release/1.2.3的历史足够规律,也许你会更喜欢看

.../commits/?since=bugfix&until=release/1.2.3

并从此列表中获取最后一次提交的父项。

我建议添加一个 --first-parent 选项,但 API 似乎没有提供该标志。

我没试过,但理论上应该可以

端点

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=release/1.2.3&until=bugfix'

也适用于非 rebased 分支。这个端点相当于

git rev-list bugfix ^release/1.2.3

这正是您所需要的。

bugfix             C1---C2---C3----C4
                  /       /     /
release/1.2.3 -R0----R1-------R2---R3

那样的话

git rev-list bugfix ^release/1.2.3

将return

C4
C3
C2
C1

所以 C1 的 parent 将作为 rebase 的基础。 如果分支 bugfix 将合并到 release/1.2.3

中,它将不起作用
bugfix             C1---C2---C3----C4--
                  /       /     /      \
release/1.2.3 -R0----R1-------R2---R3--R4--R5

在这种情况下,您需要通过

找到 R4
git rev-list ^bugfix release/1.2.3

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=bugfix&until=release/1.2.3'

这应该return

R5
R4
R3

因此您需要遍历 R5R4R3 并检查 C4 是否是您找到的 parent.Once R4 你可以使用它的 parents 并调用端点

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=R3&until=C4'