如何在GitHub action中获取分支名称?

31

在 GitHub Actions 中,我想知道分支的名称:

  • 对于 push 操作:当前分支的名称
  • 对于 pull_request 操作:目标分支的名称

我需要一个字符串,例如 developmasterfeature/xxx(而不是 refs/pull/...)。

${{ github.ref }} 变量给出的是 refs/heads/develop。如何仅获取 develop


2
这个回答解决了您的问题吗?如何在Github Actions中获取当前分支 - Cloudkollektiv
当你说“对于一个pull_request操作:目标分支的名称”,你是指源分支吗?例如,如果你创建了一个PR来合并topic-1分支到master分支,你想要的是源分支topic-1还是目标分支master - Michael R
5个回答

44

更新: GitHub添加了上下文变量${{ github.ref_name }}, 返回"触发工作流运行的分支或标签名称。"

原始回答:

您可以创建一个步骤输出,其中包含GITHUB_REF的最后部分,如下所示。

on: push
jobs:
  example:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set output
        id: vars
        run: echo ::set-output name=short_ref::${GITHUB_REF#refs/*/}

      - name: Check output
        run: echo ${{ steps.vars.outputs.short_ref }}

4
此值与 PR 过程中目标分支的名称不匹配,正如 OP 所请求的那样。 - Michael R
1
同时,GitHub在github上下文中添加了另一个上下文变量:github.ref_name,根据https://docs.github.com/en/actions/learn-github-actions/contexts#github-context的说明,该变量返回“触发工作流运行的分支或标签名称。” - Michael
17
github.ref_name在PR上不会返回分支名称...它会返回类似于144/merge这样的内容。 - ReenigneArcher
@Archer 那是真的。这到底是什么?! - Bright Lee

11

这将创建一个名为GIT_BRANCH的环境变量,其行为如下:

  • 在PR之外,此变量设置为分支的简短名称(master而不是refs/heads/master
  • 在PR内部,此变量设置为目标分支的简短名称(master而不是refs/pull/123/merge
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set environment variables
        run: |
          # Short name for current branch. For PRs, use target branch (base ref)
          GIT_BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}
          echo "GIT_BRANCH=$GIT_BRANCH" >> $GITHUB_ENV

工作原理:

  • GITHUB_BASE_REF 是 PR 触发时目标分支的简短名称,否则为空。
  • GITHUB_REF 总是有值,但值会根据上下文而改变。在 PR 外部,GITHUB_REF 是“完整”的分支名称(refs/heads/master)。在 PR 内部,它是 PR 分支名称(refs/pull/123/merge)。

因此,此脚本使用 GITHUB_BASE_REF(如果设置),否则使用 GITHUB_REF 并删除“refs/heads/”前缀。


1
OP正在询问如何获取特性分支。这将返回PR所针对的分支,而不是PR本身的分支。 - CWSites
OP 正在询问目标分支,而不是源分支。我个人认为在这里源分支更有意义,但 OP 特别指出“对于 pull_request 操作:目标分支的名称”。 - Michael R
3
在 PR 过程中,如果你想获取源分支而不是目标分支(我认为这更有意义),可以使用环境变量 GITHUB_HEAD_REF 而不是 GITHUB_BASE_REF - Michael R

4
您可以从 github 对象中获取它,例如 ${{ github.head_ref }}

11
head_ref仅针对拉取请求设置,因此虽然这将适用于拉取请求操作,但它不适用于分支推送操作(OP询问两者均可)。对于分支推送操作,需要从$GITHUB_REF${{ github.ref }}中提取分支名称。 - Tom
你可能正在寻找 github.base_ref。请参阅 https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context。 - Zach
2
请使用${{ github.head_ref || github.ref_name }},以便在拉取请求内部和外部都能正常工作。 - Etienne

3

另一个选项是将其作为环境变量:

  steps:
    - name: Set env.BRANCH
      run: echo "BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3)" >> $GITHUB_ENV

    - name: Is main?
      if: env.BRANCH == 'main'
      run: echo "This is 'main' branch"

当处于拉取请求状态时,此技术将无法产生期望的值(GITHUB_REF 将是 "refs/pull/123/merge" 而不是所请求的目标分支)。 - Michael R

0
您可以使用以下语法获取分支名称 -
name: build

on: [push, pull_request]

jobs:
  dummy-fake:
    runs-on: ubuntu-latest
    steps: 
      - name: Checkout repo
        uses: actions/checkout@v2
      - name: Verify run id
        run : echo Run Id $GITHUB_RUN_ID 
      - name: Output the branch name
        run: echo $(echo $GITHUB_REF | cut -d'/' -f 3)

2
如果分支名称中有斜杠,例如 refs/heads/feature/foo,则此操作将失败。 - Ben Whaley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接