How to Configure Ignore Patterns to Exclude Files from Parsing in Code‑Graph‑RAG
Create a .cgrignore file at your repository root alongside .gitignore; the parser loads and merges both files, applying Git‑style wildmatch patterns to skip excluded paths during indexing.
Code‑Graph‑RAG (the vitali87/code-graph-rag repository) provides flexible ignore pattern configuration through two primary sources: a dedicated .cgrignore file for tool‑specific rules and the standard .gitignore file. These patterns are compiled into a unified specification that determines which files and directories are excluded from the code graph during parsing.
Where Ignore Patterns Are Defined
The parser recognizes ignore patterns from three potential sources, loaded in a specific order:
.cgrignore— Repository‑specific patterns intended solely for Code‑Graph‑RAG.gitignore— Standard Git ignore file, automatically respected- Built‑in defaults — Hardcoded patterns for common directories like
venv,node_modules, andsite-packages
The merging logic resides in load_ignore_patterns() within [codebase_rag/config.py](https://github.com/vitali87/code-graph-rag/blob/main/codebase_rag/config.py). This function combines patterns from all sources and returns a CgrignorePatterns namedtuple containing exclude and unignore frozensets.
Creating and Editing .cgrignore
Place a .cgrignore file at the root of your target repository. The format follows standard Git ignore conventions:
# .cgrignore — Code-Graph-RAG specific ignores
# Ignore virtual environments
.venv/
env/
venv/
# Ignore compiled artifacts
*.so
*.dll
*.dylib
# Ignore generated documentation
docs/_build/
Syntax rules:
- One pattern per line
- Blank lines and lines starting with
#are ignored - Patterns without slashes match at any directory depth
- Trailing slashes restrict matches to directories only
- Glob characters (
*,?,[]) are fully supported
Using Unignore Patterns with !
Prefix a pattern with ! to create an unignore rule that rescues files from exclusion. This is particularly useful for including specific files within broadly ignored directories:
# .cgrignore with unignore rules
# Ignore all generated code
generated/
# But keep this specific file for analysis
!generated/public_api.py
# Ignore all test data
testdata/
# Except validation fixtures
!testdata/validation/
Important limitation: Unignore patterns only override built‑in ignore patterns (those defined in [codebase_rag/constants/languages.py](https://github.com/vitali87/code-graph-rag/blob/main/codebase_rag/constants/languages.py)). They do not override explicit exclude patterns you've defined in .cgrignore or .gitignore.
How Ignore Patterns Are Applied
During repository traversal, the path utilities in [codebase_rag/utils/path_utils.py](https://github.com/vitali87/code-graph-rag/blob/main/codebase_rag/utils/path_utils.py) evaluate each path against the compiled ignore specification:
| Function | Purpose |
|---|---|
should_skip_path() |
Determines if a relative path should be excluded from parsing |
should_skip_rel_file() |
File‑specific check used during file discovery |
should_skip_code_line() |
Filters individual code lines during extraction |
These functions use pathspec with GitWildMatchPattern semantics, ensuring behavior consistent with Git's ignore logic. The compiled PathSpec object is cached for performance across multiple path evaluations.
Accessing Ignore Configuration Programmatically
Import the configuration utilities to inspect or reuse the ignore patterns in custom scripts:
from pathlib import Path
from codebase_rag.config import load_ignore_patterns
# Load merged patterns for a repository
repo_path = Path("/path/to/your/repo")
patterns = load_ignore_patterns(repo_path)
# Access the compiled sets
print(f"Exclude patterns: {len(patterns.exclude)}")
print(f"Unignore patterns: {len(patterns.unignore)}")
# Check if a specific path would be ignored
from codebase_rag.utils.path_utils import should_skip_path
test_path = "node_modules/lodash/index.js"
is_excluded = should_skip_path(test_path, patterns)
print(f"{test_path} excluded: {is_excluded}")
The load_ignore_patterns() function calls load_cgrignore_patterns() internally, which parses .cgrignore line‑by‑line and separates patterns into exclude and unignore sets based on the ! prefix.
Built‑In Ignore Patterns
Code‑Graph‑RAG ships with default exclusions defined in [codebase_rag/constants/languages.py](https://github.com/vitali87/code-graph-rag/blob/main/codebase_rag/constants/languages.py). The IGNORE_PATTERNS frozenset includes:
- Version control directories (
.git/,.svn/,.hg/) - Python virtual environments (
venv/,.venv/,env/,site-packages/) - Node.js dependencies (
node_modules/) - Common build directories (
build/,dist/,target/,.egg-info/) - IDE and editor files (
.idea/,.vscode/,*.swp)
These built‑in patterns form the base exclusion set that unignore rules can selectively override.
Environment Variable for Evaluation Scripts
Some evaluation utilities support an additional ignore mechanism via the CGR_IGNORE_DIRS_ENV environment variable. This comma‑separated list supplements file‑based configuration in specialized contexts like the C# oracle evaluator. However, for standard parsing workflows, the .cgrignore file remains the recommended and canonical configuration method.
Summary
- Primary configuration: Create
.cgrignoreat repository root for Code‑Graph‑RAG‑specific ignore rules - Automatic inclusion:
.gitignorepatterns are merged automatically—no duplication needed - Syntax: Standard Git wildmatch patterns with
!prefix for unignoring built‑in exclusions - Implementation: Patterns compile via
load_ignore_patterns()inconfig.pyand apply throughpath_utils.pyfunctions - Programmatic access: Import configuration utilities to inspect or reuse ignore logic in custom tooling
Frequently Asked Questions
What happens if I have conflicting patterns in .cgrignore and .gitignore?
Both files' patterns are combined into a single exclude set. There is no precedence conflict—if a path matches any pattern from either source, it is excluded. The merger treats all user‑defined patterns equally.
Can I use .cgrignore in subdirectories, or only at the repository root?
The current implementation loads .cgrignore only from the repository root. Nested ignore files are not recursively discovered. Place all project‑wide ignore rules in the root .cgrignore file.
Why doesn't my ! unignore pattern work for paths in .gitignore?
Unignore patterns (!) only override built‑in ignore patterns hardcoded in constants/languages.py. They do not override explicit exclude patterns from .cgrignore or .gitignore. To include a file ignored by Git, remove or modify the pattern in .gitignore itself rather than attempting to unignore it in .cgrignore.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →