You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SwiftLint仅检查Git提交及修改的文件?

问题描述

我正在使用GitHub Action结合SwiftLint对Swift代码进行静态检查,希望SwiftLint仅检测项目中已提交和修改的文件。我尝试了多种方案但均未生效,恳请提供可行的建议或指导。以下是我的YAML配置文件:

name: SwiftLint

on:
  push:
    branches:
      - 'cicd'  
  
  pull_request:
    branches:
      - 'cicd'  
  
jobs:
  SwiftLint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1

      - name: GitHub Action for SwiftLint
        uses: norio-nomura/action-swiftlint@3.2.1

      - name: GitHub Action for SwiftLint with --strict
        uses: norio-nomura/action-swiftlint@3.2.1
        with:
          args: --strict

      - name: GitHub Action for SwiftLint (Only files changed in the PR compared to 'main')
        uses: norio-nomura/action-swiftlint@3.2.1
        env:
          DIFF_BASE: 'main'  # Compare changes in 'cide-sonarqube' against 'main'

      - name: GitHub Action for SwiftLint (Different working directory)
        uses: norio-nomura/action-swiftlint@3.2.1
        env:
          WORKING_DIRECTORY: Source
解决方案

你的配置存在几个核心问题:重复调用SwiftLint导致冗余、checkout版本过旧无法获取完整Git历史、差异对比的参数配置逻辑不对。下面是两种可行的修正方案:

方案一:手动筛选差异文件执行检查

直接通过Git命令提取变更的Swift文件,再喂给SwiftLint扫描,逻辑更清晰可控:

name: SwiftLint

on:
  push:
    branches: ['cicd']
  pull_request:
    branches: ['cicd']

jobs:
  swiftlint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 获取完整Git历史,确保能对比分支差异

      - name: Install SwiftLint
        run: |
          sudo apt-get update
          sudo apt-get install swiftlint

      - name: Run SwiftLint on changed files
        run: |
          # 根据事件类型获取变更的Swift文件
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            CHANGED_FILES=$(git diff --name-only ${{ github.base_ref }} ${{ github.head_ref }} | grep "\.swift$")
          else
            CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | grep "\.swift$")
          fi

          # 有变更文件才执行检查,否则跳过
          if [ -n "$CHANGED_FILES" ]; then
            swiftlint lint --strict $CHANGED_FILES
          else
            echo "No Swift files changed, skipping SwiftLint check."
          fi

方案二:优化原SwiftLint Action的配置

如果你想继续使用norio-nomura/action-swiftlint,调整配置如下:

name: SwiftLint

on:
  push:
    branches: ['cicd']
  pull_request:
    branches: ['cicd']

jobs:
  swiftlint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Run SwiftLint on changed files
        uses: norio-nomura/action-swiftlint@3.2.1
        env:
          # PR事件对比目标分支,push事件对比上一次提交
          DIFF_BASE: ${{ github.event_name == 'pull_request' && github.base_ref || 'HEAD~1' }}
        with:
          args: --strict --cache

关键注意点

  • 升级actions/checkout到v4并设置fetch-depth: 0,这是获取完整Git历史、实现差异对比的前提。
  • 动态设置DIFF_BASE,适配push和pull_request两种不同场景的对比基准。
  • 添加--cache参数可以复用之前的检查缓存,提升执行速度。
  • 移除冗余的SwiftLint调用步骤,只保留一个核心检查流程。

内容的提问来源于stack exchange,提问作者Umer Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:52:39