.gitignore Checker
See whether a file path would be ignored by your .gitignore rules — and which rule decides it.
What is gitignore Checker?
A gitignore rule evaluator. It implements git's own algorithm — last matching rule wins, patterns without a slash match at any depth, an ignored parent directory hides everything inside it — so the answer matches what git check-ignore prints.
How it works
The rules are parsed into ordered pattern objects with compiled expressions. A path is walked top-down: each ancestor directory is tested first because an excluded directory decides the whole subtree, then the path itself is tested against the remaining rules. The deciding rule, its line number and whether the decision came from a parent directory are all reported, along with a lint pass over the rules themselves.
- Paste or fill in the input. Drop in a commit message, a diff, a package.json, a path list or a set of options. The tool reads it locally — nothing is uploaded and no repository is contacted.
- Adjust the rules to match your project. Every linter here takes its convention from a setting you can change: allowed commit types, header length, target branch length, known branch names. Set them once to what your team actually uses.
- Copy the result. Generated files copy straight to the clipboard or download as a real file with the right name (.gitignore, CODEOWNERS, LICENSE, COMMIT_EDITMSG), and Reset returns every field to its default.
Examples
A commit message that fails CI
"Updated(auth): Fixed the expired-token redirect." is rejected by release automation and reported here with the exact reasons: unknown type, capitalised description, past tense and a trailing period.
A .gitignore that only half works
The Checker shows which rule decides a path — and why `!keep.txt` inside an ignored directory never fires, the mistake that sends people to Stack Overflow.
A dependency bump nobody reviewed
The package.json Diff separates added, removed and changed entries per section, so a caret bump of a runtime dependency does not hide inside a lockfile-sized pull request.
A diff pasted from a code review comment
The Diff Viewer understands several `diff --git` blocks, mode-only changes, renames and binary stubs, and calls out a pasted `--stat` summary instead of rendering an empty box.
Common mistakes
Committing a .gitignore without checking it
Rules look right and behave differently: a pattern containing a slash is anchored to the root, a trailing slash means directories only, and a file inside an ignored directory cannot be re-included. Check the paths that matter before you commit the file.
Rewriting published history
A clean commit history is worth having, but amend, rebase and filter-repo change commit hashes. Only rewrite commits that nobody has pulled; after a rewrite, push with --force-with-lease rather than --force.
Treating a generated file as if it were reviewed
These tools produce a starting point, not a decision. Check the licence text against the canonical source, read the security policy before publishing it, and make sure a CODEOWNERS team actually exists — GitHub silently ignores rules whose owner has no write access.
Putting slow checks in a pre-commit hook
A hook that takes 30 seconds gets bypassed with --no-verify within a week, and then it protects nothing. Keep pre-commit to formatting and linting, move type checks and tests to pre-push or CI.
Frequently asked questions
Why is my file still tracked when it matches an ignore rule?
Ignore rules never apply to tracked files. Run git rm --cached <path> (keeping the file on disk) once, and the rule takes effect from then on.
How do I ignore a directory but keep one file inside it?
Excluding the directory makes the whole subtree unreachable, so !dir/keep.txt cannot bring it back. Exclude the contents instead: dir/* plus !dir/keep.txt — the Checker shows both behaviours side by side.
Do rules in a subdirectory .gitignore work the same way?
Rules in a nested .gitignore are scoped to that directory, and a pattern containing a slash is anchored there rather than at the repository root. This checker evaluates one file's rules, so paste the nested file together with paths relative to it.