百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
< 返回工具列表
G

get-diff-action

> 开发工具
开源

使用 GitHub Actions 获取 git 差异

192 stars0 点赞0 次浏览
访问官网GitHub

工具介绍

使用 GitHub Actions 获取 git 差异

Get Diff Action

Read this in other languages: English, 日本語.

GitHub actions to get git diff.
You can get the differences via env or action output.

Table of Contents

Details

  • Screenshots
  • Usage
    • Example of matching files
    • Examples of non-matching files
    • Examples of env
  • Behavior
  • Outputs
  • Action event details
    • Target events
  • Addition
    • FROM, TO
    • Check only the latest commit differences in a draft Pull Request
    • To get the result in Json format
    • Specify a relative path
  • Author

generated with TOC Generator

Screenshots

  1. Example workflow

  2. Skip

Usage

Basic Usage

yaml
on: pull_request
name: CI
jobs:
  eslint:
    name: ESLint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            +(src|__tests__)/**/*.ts
            !src/exclude.ts
          FILES: |
            yarn.lock
            .eslintrc
      - name: Install Package dependencies
        run: yarn install
        if: env.GIT_DIFF
      - name: Check code style
        # Check only if there are differences in the source code
        run: yarn lint
        if: env.GIT_DIFF

Details of the patterns that can be specified

Example of matching files

  • src/main.ts
  • src/utils/abc.ts
  • __tests__/test.ts
  • yarn.lock
  • .eslintrc
  • anywhere/yarn.lock

Examples of non-matching files

  • main.ts
  • src/xyz.txt
  • src/exclude.ts

Examples of env

name value
GIT_DIFF 'src/main.ts' 'src/utils/abc.ts' '__tests__/test.ts' 'yarn.lock' '.eslintrc' 'anywhere/yarn.lock'
GIT_DIFF_FILTERED 'src/main.ts' 'src/utils/abc.ts' '__tests__/test.ts'
MATCHED_FILES 'yarn.lock' '.eslintrc' 'anywhere/yarn.lock'

Specify a little more detail

…

If there is no difference in the source code below, this workflow will skip the code style check

  • src/**/*.ts
  • __tests__/**/*.ts

Behavior

  1. Get git diff

    bash
    git diff ${FROM}${DOT}${TO} '--diff-filter=${DIFF_FILTER}' --name-only

    e.g. (default)

    yaml
    DOT: '...'
    DIFF_FILTER: 'AMRC'

    =>

    bash
    git diff ${FROM}...${TO} '--diff-filter=AMRC' --name-only

    =>

    .github/workflows/ci.yml
    __tests__/utils/command.test.ts
    package.json
    src/main.ts
    src/utils/command.ts
    src/docs.md
    yarn.lock

    ${FROM}, ${TO}

  2. Filtered by PATTERNS option

    e.g.

    yaml
    PATTERNS: |
      src/**/*.+(ts|md)
      !src/utils/*

    =>

    src/main.ts
    src/docs.md
  3. Filtered by FILES option

    e.g.

    yaml
    FILES: package.json

    =>

    package.json
    anywhere/package.json
  4. Mapped to absolute if ABSOLUTE option is true (default: false)

    e.g.

    /home/runner/work/my-repo-name/my-repo-name/src/main.ts
    /home/runner/work/my-repo-name/my-repo-name/src/docs.md
  5. Combined by SEPARATOR option

    e.g. (default)

    yaml
    SEPARATOR: ' '

    =>

    /home/runner/work/my-repo-name/my-repo-name/src/main.ts /home/runner/work/my-repo-name/my-repo-name/src/docs.md

Outputs

name description e.g.
diff The results of diff file names.
If inputs SET_ENV_NAME(default: GIT_DIFF) is set, an environment variable is set with that name. src/main.ts src/docs.md
count The number of diff files.
If inputs SET_ENV_NAME_COUNT(default: '') is set, an environment variable is set with that name. 100
insertions The number of insertions lines. (Available only if GET_FILE_DIFF is true)
If inputs SET_ENV_NAME_INSERTIONS(default: '') is set, an environment variable is set with that name. 100
deletions The number of deletions lines. (Available only if GET_FILE_DIFF is true)
If inputs SET_ENV_NAME_DELETIONS(default: '') is set, an environment variable is set with that name. 100
lines The number of diff lines. (Available only if GET_FILE_DIFF is true)
If inputs SET_ENV_NAME_LINES(default: '') is set, an environment variable is set with that name. 200

Action event details

Target events

eventName action
pull_request opened, reopened, synchronize, closed, ready_for_review
push *

If called on any other event, the result will be empty.

Addition

FROM, TO

condition FROM TO
tag push --- ---
pull request pull.base.ref (e.g. main) context.ref (e.g. refs/pull/123/merge)
push (which has related pull request) pull.base.ref (e.g. main) refs/pull/${pull.number}/merge (e.g. refs/pull/123/merge)
context.payload.before = '000...000' default branch (e.g. main) context.payload.after
else context.payload.before context.payload.after

Check only the latest commit differences in a draft Pull Request

yaml
on:
  pull_request:
    types: [opened, reopened, synchronize, closed, ready_for_review]

jobs:
  eslint:
    name: ESLint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          CHECK_ONLY_COMMIT_WHEN_DRAFT: true
      # ...

To get the result in Json format

yaml
on: pull_request
name: CI
jobs:
  dump:
    name: Dump
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            +(src|__tests__)/**/*.ts
            !src/exclude.ts
          FORMAT: json
      - run: echo '${{ env.GIT_DIFF }}' | jq .

Result:

bash
> Run echo '["yarn.lock"]' | jq .
[
  "yarn.lock"
]

Specify a relative path

GitHub Actions doesn't support working-directory for uses, so you can't run this action separately for monorepo configuration, etc. However, if you specify the RELATIVE option, it will be used as --relative= for git diff.

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---relativeltpathgt

yaml
on: pull_request
name: CI
jobs:
  dump:
    name: Dump
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: '*.ts'
          RELATIVE: 'src/abc'
      - run: echo ${{ env.GIT_DIFF }}

If the files src/abc/test1.ts, src/abc/test2.ts, src/abc/test3.txt, and src/test4.ts exist, the result will be as follows:

bash
> Run echo 'test1.ts' 'test2.ts'
test1.ts test2.ts

Author

GitHub (Technote)

Blog

Issues· 0 开放

查看全部 Issues在 GitHub 打开

暂无开放 Issues,或尚未同步最近议题。

> 标签

TypeScriptgithub-actions

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月18日
分类开发工具
定价开源

> 相关工具

V
VS Code
流行的开源代码编辑器
G
Git
分布式版本控制系统
V
Vite
下一代前端构建工具