首页 > 解决方案 > 如何验证功能分支不包含任何合并提交并且是最新的?

问题描述

我正在将 GitHub 与 CircleCI 一起使用,并想验证到达我的 master 分支的所有拉取请求都来自一个不包含 master 中不存在的合并提交的功能分支,并且该功能分支是基于最新的大师。

这意味着我总是希望历史看起来像这样:

*   1924562 Merge pull request #2 from feature-2
|\
| * 02ebbde Commit 6
| * 514752d Commit 5
| * 204d48f Commit 4
| * a1d16da Commit 3
|/
*   d03cd1e Merge pull request #1 from feature-1
|\
| * d6fe4ad Commit 2
| * 7aa415c Commit 1
|/
*   6ac1979 Initial commit

而不是例如这个:

*   1924562 Merge pull request #2 from feature-2
|\
| *   1abfe7f Merge branch 'extra-branch-1' into feature-2
| |\
| * | 02ebbde Commit 6
| * | 514752d Commit 5
| | * 204d48f Commit 4
| |/
| * a1d16da Commit 3
|/
*   d03cd1e Merge pull request #1 from feature-1
|\
| * d6fe4ad Commit 2
| * 7aa415c Commit 1
|/
*   6ac1979 Initial commit

而不是这样:

*   1924562 Merge pull request #2 from feature-2
|\
| * 02ebbde Commit 6
| * 514752d Commit 5
| * 204d48f Commit 4
| * a1d16da Commit 3
* | d03cd1e Merge pull request #1 from feature-1
|\|
| * d6fe4ad Commit 2
| * 7aa415c Commit 1
|/
*   6ac1979 Initial commit

我在想我可以通过运行一个 shell 脚本作为我的 CircleCI 管道的一部分来实现这一点,它会断言来自功能分支的每个提交都可以。

问题是我不确定如何实现这样的脚本。我想一个起点是检查仅存在于功能分支中的每个提交,并验证它们是否只有 1 个父提交:

[ $(git show --no-patch --format="%P" | wc -w) -eq 1 ] || exit 1

但我不确定如何捕捉显示的第二个错误情况,其中功能分支不是从 master 的最新 marge 提交开始的。(我认为这git merge-base可能用于那部分。)但也感觉这是必须已经解决的问题,所以我不知道从头开始重新发明轮子是否有意义。

标签: bashgitshellgithubcircleci

解决方案


你可以 :

  1. 检查它master的祖先branch
if ! git merge-base --is-ancestor master $branch; then
   echo "please rebase $branch on top of master"
   exit 1
fi
  1. 使用git rev-list --mergesorgit log --merges检查是否没有合并branch
cnt=$(git rev-list --count --merges master..$branch)

if [ "$cnt" -ne 0 ]; then
    echo "there are merge commits on $branch"
    exit 2
fi

1.将确保最新master是目标分支历史的一部分,2.将确保该历史仅包含master.


推荐阅读