Github Actions拉取请求报错:Git版本参数歧义问题求助
问题
本人仅会基础的git push和git pull操作,在GitHub Actions的拉取请求(pull request)触发流程中遇到错误,报错提示git diff的版本参数存在歧义,未知该版本或路径不在工作树中。已尝试孤立分支、重建仓库等方法,仍未解决,且另一同配置的API仓库无此问题。
报错信息
Run FORBIDDEN_FILES=("appsettings.json" "program.cs") FORBIDDEN_FILES=("appsettings.json" "program.cs") for FILE in "${FORBIDDEN_FILES[@]}"; do echo "Checking $FILE" if git diff --name-only origin/dev_branch..0a7488a784a893ab515dbd8853a32009d3f0d83d | grep -q "^$FILE$"; then echo "Error: You are trying to merge changes to a forbidden file: $FILE" exit 1 fi done shell: /usr/bin/bash -e {0} Checking appsettings.json fatal: ambiguous argument 'origin/dev_branch..0a7488a784a893ab515dbd8853a32009d3f0d83d': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' Checking program.cs fatal: ambiguous argument 'origin/dev_branch..0a7488a784a893ab515dbd8853a32009d3f0d83d': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
对应的GitHub Actions代码
name: Check Forbidden Files on: pull_request jobs: check: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Check for forbidden file changes run: | FORBIDDEN_FILES=("appsettings.json" "program.cs") for FILE in "${FORBIDDEN_FILES[@]}"; do echo "Checking $FILE" if git diff --name-only origin/${{ github.base_ref }}..${{ github.sha }} | grep -q "^$FILE$"; then echo "Error: You are trying to merge changes to a forbidden file: $FILE" exit 1 fi done
解决建议
拉取完整仓库历史与远程分支:默认的
actions/checkout@v3只会拉取当前提交的代码,不会获取远程分支的完整信息。修改checkout步骤,添加fetch-depth: 0参数拉取所有历史,同时显式拉取目标分支:- name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整仓库历史 - name: Fetch target branch run: git fetch origin ${{ github.base_ref }}修正
git diff的参数格式:报错提示参数歧义,可在git diff末尾添加--明确分隔版本和路径(即使这里没有路径参数,也能避免歧义),同时确保引用的分支或提交存在:git diff --name-only origin/${{ github.base_ref }}..${{ github.sha }} --改用GitHub提供的PR对比变量:在PR触发的Actions中,GitHub提供了
github.event.pull_request.base.sha和github.event.pull_request.head.sha,直接用这两个变量对比更可靠,避免分支名引用的问题:git diff --name-only ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} --验证提交存在性:在执行
git diff前先检查提交是否存在,避免无效引用:if ! git rev-parse --verify origin/${{ github.base_ref }} > /dev/null 2>&1; then echo "Error: Base branch origin/${{ github.base_ref }} not found" exit 1 fi if ! git rev-parse --verify ${{ github.sha }} > /dev/null 2>&1; then echo "Error: Head commit ${{ github.sha }} not found" exit 1 fi
内容的提问来源于stack exchange,提问作者Alexander Fields
相关产品推荐
相关产品推荐

