如何在github操作中获取当前分支

如何在github操作中获取当前分支,github,github-actions,Github,Github Actions,我正在使用Github操作构建docker图像,并希望使用分支名称标记图像, 我只找到了GITHUB\u-REF变量,但它产生了refs/heads/feature-branch-1,我只需要feature-branch-1我相信GITHUB\u-REF是唯一包含分支名称的环境变量 您可以仅从该字符串的其余部分提取分支名称,如下所示: ${GITHUB_REF##*/} 例如: $ GITHUB_REF=refs/heads/feature-branch-1 $ echo ${GITHUB_R

我正在使用Github操作构建docker图像,并希望使用分支名称标记图像,
我只找到了
GITHUB\u-REF
变量,但它产生了
refs/heads/feature-branch-1
,我只需要
feature-branch-1

我相信
GITHUB\u-REF
是唯一包含分支名称的环境变量

您可以仅从该字符串的其余部分提取分支名称,如下所示:

${GITHUB_REF##*/}
例如:

$ GITHUB_REF=refs/heads/feature-branch-1
$ echo ${GITHUB_REF##*/}
feature-branch-1

更新:添加了完整的工作流示例。

工作流程 资料来源:

示例输出-主分支 日志:

示例输出-非主分支 日志:


有关参数扩展语法的详细信息,请参阅


作为参考,该页面列出了执行环境中可用的所有环境变量。

我添加了一个单独的步骤,用于从
$GITHUB\u REF
提取分支名称,并将其设置为步骤输出

-name:提取分支名称
shell:bash
运行:echo“##[设置输出名称=分支;]$(echo${GITHUB\u REF#refs/heads/})”
id:extract_分支机构
之后,我可以在接下来的步骤中使用它

-名称:推送到ECR
身份证号码:ecr
用途:jwalton/gh ecr-push@master
与:
访问密钥id:${{secrets.AWS_access_key_id}
秘密访问密钥:${secrets.AWS\u secret\u access\u key}
地区:美国西部-2
image:eng:${{steps.extract_branch.outputs.branch}}
您可以使用


我刚刚使用bash脚本在中进行了一个简单的测试:

#/bin/bash
echo为REPO_NAME=${GITHUB_存储库##*/}保留
echo GITHUB_REF=${GITHUB_REF}
echo EXTRACT_GITHUB_REF=${GITHUB_REF##*/}
echo EXTRACT_GITHUB_REF_HEADS=$(echo${GITHUB_REF#refs/HEADS/})
cd$REPO_名称
git签出${GITHUB_REF##*/}
git checkout$(echo${GITHUB_REF#refs/heads/})
以下是输出的屏幕截图:


因此
${GITHUB#REF##*/}
$(echo${GITHUB#REF#refs/heads/})
都是正确的

要将其设置为en变量,我使用以下语法:

- name: Extract branch name
  shell: bash
  run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/} | sed 's/\//_/g')"
- name: Test
  run: echo "${BRANCH_NAME}"
我在这里找到了以下语法:


Rmq:
sed's/\//\ug'
将分支名称中的
/
替换为

请注意,如果您正在对pull请求触发器执行GitHub操作,然后,
GITHUB\u REF
变量将包含类似于
refs/pull/421/merge
的内容,因此如果您尝试将
git push
推送到该名称,则很可能失败

不过,您可以在YAML中使用GitHub上下文上的引用。类似于:
${{github.head\u ref}}

您可以使用上述命令替换要运行的任何分支或事件

如何在Github操作中获取当前分支

假设
${{github.ref}
类似于
refs/heads/mybranch
,则可以使用以下方法提取分支名称:

steps:
  - name: Prints the current branch name
    run: echo "${GITHUB_BRANCH##*/}"
    env:
      GITHUB_BRANCH: ${{ github.ref }}
如果分支包含斜杠(例如
feature/foo
),请使用以下语法:

steps:
  - name: Prints the current branch name
    run: echo "${GITHUB_REF#refs/heads/}"
学分:

或者使用公认答案中的方法,这里有一个更简短的版本(lint-friendly):

然后在其他步骤中引用为
${{steps.myref.outputs.branch}

注:

  • 以上方法仅适用于基于Unix的映像(Linux和macOS)
  • 对于文档,请阅读:
    • 在Windows上运行?。 Windows默认命令是PowerShell终端

        - name: SET CURRENT_BRANCH
          run: |
            $branchName = "${{github.ref}}".Split("/")["${{github.ref}}".Split("/").Length -1]
            echo "::set-env name=CURRENT_BRANCH::$(echo $branchName)"
      

      在GitHub操作上使用分支名称

      使用当前分支名称的方便操作。 用法


      这里有一个完整的工作流,可用于
      推送
      拉取请求
      事件

      name: whichBranch
      on: [pull_request, push]
      
      jobs:
        which_branch:
          runs-on: ubuntu-latest
          steps:
            # extract branch name
            - name: Extract branch name
              if: github.event_name != 'pull_request'
              shell: bash
              run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
              id: extract_branch
      
            # extract branch name on pull request
            - name: Print branch name
              if: github.event_name == 'pull_request'
              run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"
      
            # print branch name
            - name: Get branch name
              run: echo 'The branch name is' $BRANCH_NAME
      
      GitHub操作公开了几个有用的环境变量,例如当前分支名称及其slug值。我做这个动作正是为了这个用例

      用法


      所有操作系统(Linux、macOS和Windows)的演示也可以在存储库的中找到

      使用
      setenv
      is。建议使用。在@youjin的基础上,虽然仍然允许
      功能/
      分支(将所有出现的
      /
      替换为
      -
      ),但我现在使用的是:

      作业:
      建造:
      运行于:ubuntu最新版本
      步骤:
      -名称:获取分支名称(合并)
      if:github.event_name!='拉_请求'
      shell:bash
      运行:echo“BRANCH_NAME=$(echo${GITHUB_REF#refs/heads/}| tr/-)”>>GITHUB_ENV
      -名称:获取分支名称(拉取请求)
      if:github.event\u name=='pull\u请求'
      shell:bash
      运行:echo“BRANCH\u NAME=$(echo${GITHUB\u HEAD\u REF}}tr/-)”>>GITHUB\u ENV
      -名称:调试
      运行:echo${{env.BRANCH_NAME}
      
      对于使用Windows image运行操作的用户,需要了解以下几个关键点:

    • 假设GitHub操作使用cmdshell是不正确的。默认情况下,它们是
    • 可以通过以下方式指定外壳:
    • 可以使用值“bash”在bashshell的上下文中执行命令
    • 所以,总而言之,你不需要浪费可能的时间去想如何用破旧的cmd方式做事(就像我做的那样)

      为了获得当前分支的名称,您可以在将shell设置为“bash”时使用流行的解决方案,或者使用以下简单方法在默认PowerShell shell中设置变量:

      $branchName=$Env:GITHUB\u REF-替换“refs/heads/”
      
      我做了一个操作,不管是否触发pull_请求,都会获取分支名称

      如果您使用的是
      操作/checkout
      的V2,那么您总是可以运行
      git branch--show current
      来获取当前签出的分支的名称。

      这里有一个片段,它基于
      $GITHUB\u REF
      设置了一个环境变量,如果不存在,则默认为
      dev

      根据您的要求调整sed命令

      export GIT_BRANCH=$(echo${GITHUB_REF:-dev}sed s
      
      if: github.ref == 'refs/heads/integration' && github.event_name == 'push' 
      
      steps:
        - name: Prints the current branch name
          run: echo "${GITHUB_BRANCH##*/}"
          env:
            GITHUB_BRANCH: ${{ github.ref }}
      
      steps:
        - name: Prints the current branch name
          run: echo "${GITHUB_REF#refs/heads/}"
      
      steps:
        - name: Get the current branch name
          shell: bash
          run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}"
          id: myref
      
        - name: SET CURRENT_BRANCH
          run: |
            $branchName = "${{github.ref}}".Split("/")["${{github.ref}}".Split("/").Length -1]
            echo "::set-env name=CURRENT_BRANCH::$(echo $branchName)"
      
      name: build
      on: push
      
      jobs:
        build:
          runs-on: ubuntu-latest
          steps:
          - uses: actions/checkout@v1
          - run: npm ci
          - uses: nelonoel/branch-name@v1
          # Use branch name for whatever purpose
          - run: echo ${BRANCH_NAME}
      
      name: whichBranch
      on: [pull_request, push]
      
      jobs:
        which_branch:
          runs-on: ubuntu-latest
          steps:
            # extract branch name
            - name: Extract branch name
              if: github.event_name != 'pull_request'
              shell: bash
              run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
              id: extract_branch
      
            # extract branch name on pull request
            - name: Print branch name
              if: github.event_name == 'pull_request'
              run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"
      
            # print branch name
            - name: Get branch name
              run: echo 'The branch name is' $BRANCH_NAME
      
      steps:
        - uses: FranzDiebold/github-env-vars-action@v1.2.0
        - name: Print environment variables
          run: |
            echo "GITHUB_REPOSITORY_SLUG=$GITHUB_REPOSITORY_SLUG"
            echo "GITHUB_REPOSITORY_OWNER=$GITHUB_REPOSITORY_OWNER"
            echo "GITHUB_REPOSITORY_OWNER_SLUG=$GITHUB_REPOSITORY_OWNER_SLUG"
            echo "GITHUB_REPOSITORY_NAME=$GITHUB_REPOSITORY_NAME"
            echo "GITHUB_REPOSITORY_NAME_SLUG=$GITHUB_REPOSITORY_NAME_SLUG"
            echo "GITHUB_REF_SLUG=$GITHUB_REF_SLUG"
            echo "GITHUB_REF_NAME=$GITHUB_REF_NAME"
            echo "GITHUB_REF_NAME_SLUG=$GITHUB_REF_NAME_SLUG"
            echo "GITHUB_SHA_SHORT=$GITHUB_SHA_SHORT"
      
      - run: |
          ...
        shell: cmd