Bash 如何验证功能分支不存在';是否不包含任何合并提交并且是最新的?
我正在将GitHub与CircleCI一起使用,并希望验证所有到我的主分支的拉请求是否来自一个功能分支,该功能分支不包含主分支中不存在的合并提交,并且该功能分支已在最新的主分支上重设基础 这意味着我总是希望历史像这样: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
*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