使用GitHub Actions执行git clang-format时遇git rev-parse main错误
GitHub Actions中git rev-parse main报错的解决方案
问题背景
配置GitHub Actions实现向main分支提交PR时自动检查代码格式规范的Workflow时,执行git rev-parse main命令持续报错。本地Windows环境下该命令可正常运行,但Actions中返回错误:
fatal: ambiguous argument 'main': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
错误原因
actions/checkout@v2默认仅拉取当前PR的HEAD提交,不会拉取仓库完整历史或其他分支的引用,因此在Actions环境中git无法识别main分支名。
修复方案
方案1:拉取完整仓库历史
修改checkout步骤,添加fetch-depth: 0参数拉取仓库所有分支与完整历史:
- name: Checkout repository uses: actions/checkout@v2 with: fetch-depth: 0 # 拉取完整仓库数据,包含所有分支和历史
方案2:单独拉取main分支
若无需完整历史,可在checkout后单独拉取main分支:
- name: Checkout repository uses: actions/checkout@v2 - name: Fetch main branch run: git fetch origin main:main
方案3:使用PR的base分支环境变量(推荐)
利用GitHub Actions提供的GITHUB_BASE_REF环境变量直接获取PR目标分支引用,该方式更通用,后续目标分支名称变更无需修改Workflow:
- name: Get commit ID of base branch run: | BASE_COMMIT=$(git rev-parse origin/${{ github.base_ref }}) echo "Commit ID of base branch: $BASE_COMMIT" - name: Check code formatting run: | git clang-format --style=firmware/.clang-format --diff $BASE_COMMIT..HEAD '*.cpp' '*.h'
完整修复后的Workflow配置
基于完整历史拉取的版本
on: pull_request: branches: - main jobs: clang_format_check: name: Check Clang Format runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up clang-format run: sudo apt-get install clang-format - name: Get commit ID of main branch run: | MAIN_COMMIT=$(git rev-parse main) echo "Commit ID of main branch: $MAIN_COMMIT" - name: Check code formatting run: | git clang-format --style=firmware/.clang-format --diff $MAIN_COMMIT..HEAD '*.cpp' '*.h' - name: Check for changes id: check_changes run: | git diff --exit-code || (echo "Code is not formatted properly. Please run clang-format and commit the changes." && exit 1) - name: Complete if: steps.check_changes.outcome == 'success' run: echo "Code is properly formatted."
基于环境变量的推荐版本
on: pull_request: branches: - main jobs: clang_format_check: name: Check Clang Format runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Set up clang-format run: sudo apt-get install clang-format - name: Get commit ID of base branch run: | BASE_COMMIT=$(git rev-parse origin/${{ github.base_ref }}) echo "Commit ID of base branch: $BASE_COMMIT" - name: Check code formatting run: | git clang-format --style=firmware/.clang-format --diff $BASE_COMMIT..HEAD '*.cpp' '*.h' - name: Check for changes id: check_changes run: | git diff --exit-code || (echo "Code is not formatted properly. Please run clang-format and commit the changes." && exit 1) - name: Complete if: steps.check_changes.outcome == 'success' run: echo "Code is properly formatted."
内容的提问来源于stack exchange,提问作者Micnasr
相关产品推荐
相关产品推荐

