如何在 GitHub 操作上获取分支名称?

Syl*_*ain 10 github github-actions

在 GitHub 操作期间,我想知道分支的名称:

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

我需要一个像develop, masteror的字符串feature/xxx(而不是 refs/pull/...)。

${{ github.ref }}变种给我refs/heads/develop。我怎样才能只得到develop

pet*_*ans 15

您可以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 }}
Run Code Online (Sandbox Code Playgroud)

  • `github.ref_name` 不会返回 PR 上的分支名称...它返回类似 `144/merge` 的内容 (18认同)
  • 该值与 PR 期间目标分支的名称不匹配,正如 OP 所请求的那样 (4认同)

Mic*_*l R 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
Run Code Online (Sandbox Code Playgroud)

这是如何运作的:

  • 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/”前缀。

  • 要在 PR 期间获取源分支而不是目标分支(这对我来说更有意义),您可以使用环境变量 `GITHUB_HEAD_REF` 而不是 `GITHUB_BASE_REF` (3认同)