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
在功能分支上),我能想到的最好的是:
- 解析
Merge branch 'release/1.2.3' of <repo> into bugfix
的提交消息,这看起来很脆弱,因为有人可能会重写合并提交消息
- 找到最近的有两个 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
因此您需要遍历 R5
、R4
和 R3
并检查 C4
是否是您找到的 parent.Once R4
你可以使用它的 parents 并调用端点
/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=R3&until=C4'
总结
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
在功能分支上),我能想到的最好的是:
- 解析
Merge branch 'release/1.2.3' of <repo> into bugfix
的提交消息,这看起来很脆弱,因为有人可能会重写合并提交消息 - 找到最近的有两个 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
在这种情况下,您需要通过
找到 R4git 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
因此您需要遍历 R5
、R4
和 R3
并检查 C4
是否是您找到的 parent.Once R4
你可以使用它的 parents 并调用端点
/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=R3&until=C4'