在Github Action中运行'git notes`时出现权限被拒绝错误

q3qa4bjr  于 2023-01-28  发布在  Git
关注(0)|答案(2)|浏览(242)

我在我的repo上有以下Github操作。(为了示例起见,)我希望我的工作流在推送的提交上添加一个git notes(即运行git notes add -m "foo bar")。
但是,我得到了以下错误:
致命错误:引用refs/notes/commits的update_ref失败:无法锁定引用refs/notes/commits:* * 无法创建/home/runner/work/repo_name/repo_name/.git/refs/notes/commits.lock:权限被拒绝**
目前为止我尝试的方法是:

  • 我以为使用${{ github.token }}会有所帮助,但事实并非如此。
  • 我确保在存储库的Settings/Actions/General/Workflow权限中设置了"Read and Write permissions"。
  • 这也不是chmod +x的问题,因为我直接运行命令。
  • 将工作流权限设置为write-all(如Azeem所建议)也不能解决这个问题。

这可能是并发问题吗?
Github操作YAML文件:

name: Notes

on:
  workflow_dispatch:

permissions: write-all

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          token: ${{ github.token }}
      - name: Add git notes
        id: git-notes
        run: |
          git config user.name "Github Actions"
          git config user.email "bot@github.actions"
          git notes add -m "foo bar"
        env:
          GITHUB_TOKEN: ${{ github.token }}

日志:

Run git config user.name "Github Actions"
  git config user.name "Github Actions"
  git config user.email "bot@github.actions"
  git notes add --allow-empty -m "foo bar"
  shell: /usr/bin/bash -e {0}
  env:
    GITHUB_TOKEN: ***
Removing note for object HEAD
fatal: update_ref failed for ref 'refs/notes/commits': cannot lock ref 'refs/notes/commits': Unable to create '/home/runner/work/marion_test_notes/marion_test_notes/.git/refs/notes/commits.lock': Permission denied
Error: Process completed with exit code 128.
ar7v8xwq

ar7v8xwq1#

刚刚尝试使用此工作流重现您的方案:

name: git_notes

on:
  workflow_dispatch:

permissions:
  actions: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: '0'
          token: ${{ github.token }}
      - name: Add git notes
        id: git-notes
        run: |
          git config user.name "Github Actions"
          git config user.email "bot@github.actions"
          git notes add -m "foo bar"
          git notes show

但是,它的工作很好。
以下是工作流运行(注解使用git notes show验证):

由于问题似乎不与工作流程,您可能需要检查是否有任何分支保护规则阻碍这对您的一方.

bjp0bcyl

bjp0bcyl2#

多亏了Azeem's minimal working example,我已经解决了我的问题。
在我的例子中,产生这个错误是因为提交已经有了一个注解(由工作流的一个单独步骤添加)。
基于Azeem的解决方案,我遇到了导致工作流失败的其他问题,例如:

  • 提交已经具有注解(初始发布),
  • 所添加的注解不被"向上推"即一旦工作流结束它就消失,而不是被永久地添加到历史,
  • 历史记录中的其他提交已经有了git注解(但这些注解不是通过简单地使用actions/checkout步骤来同步的),
  • 如果第二次运行,则工作流失败。

长话短说,下面是一个工作流,它在检出的head上稳健地添加了一个git notes

name: git notes

on:
  workflow_dispatch:

jobs:
  add_git_note:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          token: ${{ github.token }}
      - name: Add a git note
        run: |
          git fetch origin refs/notes/*:refs/notes/*
          git config user.name "github-actions"
          git config user.email "bot@github.com"
          git notes add --allow-empty --force --message="foo bar"
          git notes show
          git push origin refs/notes/*

说明:

  • git fetch origin refs/notes/*:refs/notes/*:"Pull"已经存在于repo中的git notes(否则,当您尝试将新注解推回上游时,会发生冲突),
  • git config:创建git ID,需要添加一条注解,并向上游推送。
  • git notes add:添加您的备注
  • --allow-empty:如果您的消息为空(例如,已由工作流的上一步骤生成),
  • --force:以防您再次运行工作流(因此提交已经有了注解)。请注意(很明显),这将覆盖任何已经存在的git notes。否则,您可以查看git notes append
  • git notes show:廉价日志记录
  • git push origin refs/notes/*:将note推回上游(即推到git repo),以便它在工作流结束时仍然存在。
    • 参考资料:**
  • git notes documentation
  • How to sync(即"拉入"和"推送")git notes与上游
  • git notes | Enhance Git Commit Messages with Notes
  • Git Notes: git's coolest, most unloved­ feature

相关问题