Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何验证功能分支不存在';是否不包含任何合并提交并且是最新的?_Bash_Git_Shell_Github_Circleci - Fatal编程技术网

Bash 如何验证功能分支不存在';是否不包含任何合并提交并且是最新的?

Bash 如何验证功能分支不存在';是否不包含任何合并提交并且是最新的?,bash,git,shell,github,circleci,Bash,Git,Shell,Github,Circleci,我正在将GitHub与CircleCI一起使用,并希望验证所有到我的主分支的拉请求是否来自一个功能分支,该功能分支不包含主分支中不存在的合并提交,并且该功能分支已在最新的主分支上重设基础 这意味着我总是希望历史像这样: *1924562功能部件2的合并拉取请求#2 |\ |*02ebbde提交6 |*514752d提交5 |*204d48f提交4 |*a1d16da提交3 |/ *d03cd1e合并拉取请求#1来自功能-1 |\ |*d6fe4ad提交2 |*7aa415c提交1 |/ *6ac

我正在将GitHub与CircleCI一起使用,并希望验证所有到我的主分支的拉请求是否来自一个功能分支,该功能分支不包含主分支中不存在的合并提交,并且该功能分支已在最新的主分支上重设基础

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

*1924562功能部件2的合并拉取请求#2
|\
|*02ebbde提交6
|*514752d提交5
|*204d48f提交4
|*a1d16da提交3
|/
*d03cd1e合并拉取请求#1来自功能-1
|\
|*d6fe4ad提交2
|*7aa415c提交1
|/
*6ac1979初始提交
例如:

*1924562功能部件2的合并拉取请求#2
|\
|*1abfe7f将分支“额外分支-1”合并到功能-2中
| |\
|*| 02ebbde提交6
|*| 514752d提交5
||*204d48f提交4
| |/
|*a1d16da提交3
|/
*d03cd1e合并拉取请求#1来自功能-1
|\
|*d6fe4ad提交2
|*7aa415c提交1
|/
*6ac1979初始提交
不是这样的:

*1924562功能部件2的合并拉取请求#2
|\
|*02ebbde提交6
|*514752d提交5
|*204d48f提交4
|*a1d16da提交3
*| d03cd1e合并拉取请求#1来自功能-1
|\|
|*d6fe4ad提交2
|*7aa415c提交1
|/
*6ac1979初始提交
我想我可以通过运行一个shell脚本作为CircleCI管道的一部分来实现这一点,它可以断言来自feature分支的每个提交都是正常的

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

[ $(git show --no-patch --format="%P" | wc -w) -eq 1 ] || exit 1
但我不确定如何捕捉第二个错误案例,其中特性分支不是从master的最新marge commit开始的。(我认为,
git merge base
可能会用于这一部分。)但它也感觉到这是一个必须已经解决的问题,所以我不知道从头开始重新设计轮子是否有意义。

你可以:

  • 检查
    master
    是否为
    分支的祖先:
  • 使用
    git rev list--merges
    git log--merges
    检查
    分支上是否没有合并:
  • 1.
    将确保最新的
    主文件
    是目标分支机构历史记录的一部分,
    2.
    将确保此历史记录仅包含在
    主文件
    上的一条提交直线。您可以:

  • 检查
    master
    是否为
    分支的祖先:
  • 使用
    git rev list--merges
    git log--merges
    检查
    分支上是否没有合并:
  • 1。
    将确保最新的
    master
    是目标分支历史记录的一部分,
    2。
    将确保此历史记录仅由
    master
    上方的一条提交直线组成

    if ! git merge-base --is-ancestor master $branch; then
       echo "please rebase $branch on top of master"
       exit 1
    fi
    
    cnt=$(git rev-list --count --merges master..$branch)
    
    if [ "$cnt" -ne 0 ]; then
        echo "there are merge commits on $branch"
        exit 2
    fi