get-diff-action
get-diff-action copied to clipboard
GitHub Actions to get git diff
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
-
Example workflow

-
Skip

Usage
Basic Usage
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.tssrc/utils/abc.ts__tests__/test.tsyarn.lock.eslintrcanywhere/yarn.lock
Examples of non-matching files
main.tssrc/xyz.txtsrc/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
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
FILES: |
yarn.lock
.eslintrc
- name: Install Package dependencies
run: yarn install
if: env.GIT_DIFF
- name: Check code style
# Check only source files with differences
run: yarn eslint ${{ env.GIT_DIFF_FILTERED }} # e.g. yarn eslint 'src/main.ts' '__tests__/test.ts'
if: env.GIT_DIFF && !env.MATCHED_FILES
- name: Check code style
# Check only if there are differences in the source code (Run a lint on all files if there are changes to yarn.lock or .eslintrc)
run: yarn lint
if: env.GIT_DIFF && env.MATCHED_FILES
If there is no difference in the source code below, this workflow will skip the code style check
src/**/*.ts__tests__/**/*.ts
Behavior
-
Get git diff
git diff ${FROM}${DOT}${TO} '--diff-filter=${DIFF_FILTER}' --name-onlye.g. (default)
DOT: '...' DIFF_FILTER: 'AMRC'=>
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}
-
Filtered by
PATTERNSoptione.g.
PATTERNS: | src/**/*.+(ts|md) !src/utils/*=>
src/main.ts src/docs.md -
Filtered by
FILESoptione.g.
FILES: package.json=>
package.json anywhere/package.json -
Mapped to absolute if
ABSOLUTEoption 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 -
Combined by
SEPARATORoptione.g. (default)
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
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
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:
> 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=<RELATIVE> for git diff.
https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---relativeltpathgt
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:
> Run echo 'test1.ts' 'test2.ts'
test1.ts test2.ts