Git 如何在jenkins管道中识别合并提交?

Git 如何在jenkins管道中识别合并提交?,git,jenkins,github,Git,Jenkins,Github,当我将某个分支合并到主分支时(在GitHub中),会触发jenkins管道 在Jenkins的“这是一个合并提交”中,有没有一种方法可以在当前执行期间使用git的任何命令进行标识?(不是webhook-我正在寻找另一种解决方案) 简单:我有提交id28c7be3b705fb517b09067e059fdlskkdjsa7ce0fd3,我想知道这个合并提交(PR到主机)是否成功。一个简单的方法是:检查这个提交是否有第二个父级 if git rev-parse --verify -q $commit

当我将某个分支合并到主分支时(在GitHub中),会触发jenkins管道

在Jenkins的“这是一个合并提交”中,有没有一种方法可以在当前执行期间使用git的任何命令进行标识?(不是webhook-我正在寻找另一种解决方案)


简单:我有提交id
28c7be3b705fb517b09067e059fdlskkdjsa7ce0fd3
,我想知道这个合并提交(PR到主机)是否成功。

一个简单的方法是:检查这个提交是否有第二个父级

if git rev-parse --verify -q $commitid^2 > /dev/null; then
   echo "commit $commitid is a merge commit"
else
   echo "commit $commitid is a simple commit"
fi
  • --验证
    验证是否只提供了一个参数,以及是否可以将其转换为可用于访问对象数据库的原始20字节SHA-1。如果是,则将其发射到标准输出;否则,就会出错
  • -q
    仅在
    --验证模式下有意义。如果第一个参数不是有效的对象名称,则不要输出错误消息;而是以非零状态静默退出
  • $commitid
    提交的长或短SHA-1哈希
  • ^2
    ^
    表示“该提交对象的第一个父对象”以及附加的
    2
    这将变为“该提交对象的第二个父对象”,因此
    ^n
    =“该提交对象的第n个父对象”,如果提交没有第n个父对象,则命令返回值为
    128
    (否则
    0
  • 案例中不需要输出,因此可以将其重定向到
    /dev/null
    ——成功后,此命令将输入转换为完整的sha,并在标准输出上打印
有关git rev parse的完整文档可用


如果您想检查,
$commitid
是否是Github拉取请求的一部分,这是另一个要求

拉取请求信息的一部分(例如:特定PR指向的提交)存储在git中,但您需要使用Github API()来访问其他信息(例如:PR状态、其作者、其讨论内容等)

Github在
git
中为每个以
refs/pull/
为前缀的pull请求创建引用;对于拉取请求
{xx}
,该拉取请求的头存储在
refs/pull/{xx}/head
中,如果PR被合并,则合并的结果存储在
refs/pull/{xx}/merge

您可以使用它来确定当前提交是否是拉取请求的头部:

# fetch references starting with 'refs/pull/...',
# store them locally next to the remote branches : 'refs/remotes/origin/pull/...'
#   (note: you can choose whatever pattern you want to store these references locally)
git fetch origin "+refs/pull/*:refs/remotes/origin/pull/*"

# check if one of these refs point to $commitid :
git for-each-ref --points-at "$commitid" refs/remotes/orign/pull

# you can use '--format' to customize the output :
# for example you can remove the leading 'refs/remotes/origin/pull' to have a shorter output :
$ git for-each-ref --format="%(refname:lstrip=4)" --points-at "$commitid" refs/remotes/orign/pull
42/head    # <- this means it is the current head of PR #42
我想扩展

  • --验证
    验证是否只提供了一个参数,以及是否可以将其转换为可用于访问对象数据库的原始20字节SHA-1。如果是,则将其发射到标准输出;否则,就会出错
  • -q
    仅在
    --验证模式下有意义。如果第一个参数不是有效的对象名称,则不要输出错误消息;而是以非零状态静默退出
  • $commitid
    提交的长或短SHA-1哈希
  • ^2
    ^
    表示“该提交对象的第一个父对象”以及附加的
    2
    这将变为“该提交对象的第二个父对象”,因此
    ^n
    =“该提交对象的第n个父对象”,如果提交没有第n个父对象,则命令返回值为
    128
    (否则
    0

提供完整的文档。

谢谢。你能解释一下参数吗?当我在github中打开PR事件时,jenkins说它是merge commit,但事实并非如此。如何解决这种情况?使用@Max建议的解释更新了此答案。您可以更新答案以添加所有参数。@Max:我在答案中复制了您的解释,谢谢
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/{myuser}/{myrepo}/pulls/42
if git rev-parse --verify -q $commitid^2 > /dev/null; then
   echo "commit $commitid is a merge commit"
else
   echo "commit $commitid is a simple commit"
fi