dorny/paths-filter Outputs Always False - Causes & Fixes
dorny/paths-filter reports every filter as false (or true) because it cannot compute the changed-file set - usually a checkout without enough history, or a base it cannot diff against.
What this error means
Downstream steps gated on steps.filter.outputs.<name> never run (or always run). The filter step succeeds but its boolean outputs do not reflect the actual file changes.
- uses: dorny/paths-filter@v3
id: filter
# later: steps.filter.outputs.src is always 'false'
# because the diff base could not be resolved on a push eventCommon causes
No base ref to diff against
On push events the action diffs against the before commit; on a force-push or first commit, or with a shallow clone lacking that ref, it cannot compute changes and returns false.
Missing step id or mismatched filter keys
Outputs are read as steps.<id>.outputs.<filter>. Without an id on the step, or with a filter name that does not match what you reference, the condition reads an empty value.
How to fix it
Give the step an id and define filters
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
src:
- 'src/**'
- if: steps.filter.outputs.src == 'true'
run: npm testProvide a base for events without one
- On pull_request the action diffs against the PR base automatically.
- For push on the default branch, set base to the branch so it diffs against the prior commit.
- Avoid overly shallow checkouts that drop the commit the diff needs.
How to prevent it
- Always give paths-filter a stable id and compare outputs to the string "true".
- Set an explicit base for push events on the default branch.
- Prefer pull_request events where the diff base is unambiguous.