当命令返回0时,GitHub操作失败,退出代码为1

jhiyze9q  于 5个月前  发布在  Git
关注(0)|答案(1)|浏览(85)

我正在为一个项目做一个github动作,这个项目有以下部分:

- name: Check for version change
        id: check_version
        run: |
          git fetch origin main
          VERSION_CHANGED=$(git diff --name-only ${{ github.event.before }}..HEAD | grep -c '^src/manifest.json$')
          echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_OUTPUT"

字符串
它允许我查看我的清单文件中是否有更改。如果是,则返回1,如果否,则返回0。
问题是,当它返回1时,我的所有其他操作都顺利进行,但另一方面,它退出我,并出现以下错误:

Run git fetch origin main
  git fetch origin main
  VERSION_CHANGED=$(git diff --name-only 32f9a1bbdaa01bcda6cbc59973fe89707c92abc2..HEAD | grep -c '^src/manifest.json$')
  echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_OUTPUT"
  shell: /usr/bin/bash -e {0}
 * branch            main       -> FETCH_HEAD
Error: Process completed with exit code 1.


这是一切顺利的结果,即使我怀疑它会有任何好处:

Run git fetch origin main
  git fetch origin main
  VERSION_CHANGED=$(git diff --name-only c47cdb4394c93c367b97241d7618a7608e9acb64..HEAD | grep -c '^src/manifest.json$')
  echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_OUTPUT"
  shell: /usr/bin/bash -e {0}
 * branch            main       -> FETCH_HEAD

kpbwa7wx

kpbwa7wx1#

与退出状态相关的是grep是否匹配; grep -c的数值并不直接相关。
如果至少有一行与正则表达式匹配,则退出状态为0(成功),VERSION_CHANGED为1或更大。
如果没有匹配的行,则退出状态为1(不成功),VERSION_CHANGED为0(如果设置了,请参见下文)。
由于run步骤启用了set -e(出错时退出),因此如果没有匹配项,将立即退出,并且不会设置VERSION_CHANGED
因为你实际上对行数并不感兴趣(我认为),而只是想看看一个特定的文件是否被修改了,你可以把这个检查移到一个if条件中,它不受set -e行为的影响:

env:
  before: ${{ github.event.before }}
run: |
  if git diff --name-only "$before"..HEAD | grep -q '^src/manifest\.json$'; then
      changed=1
  else
      changed=0
  fi

  echo "VERSION_CHANGED=$changed" >> "$GITHUB_OUTPUT"

字符串
我使用grep -q而不是grep -c,它只设置退出状态,不产生任何输出。

相关问题