Sparse checkout lets you work with only specific files from a repository, but misconfiguration causes checkout failures and missing files.
The Error
Setting up sparse checkout:
git sparse-checkout init
git sparse-checkout set src/appYou see:
error: pattern 'src/app' does not match any files
warning: sparse checkout: no entries selectedOr checking out:
git checkout mainerror: Your local changes to the following files would be overwritten by sparse checkout update:
src/test.js
Please commit your changes or stash them before you switch branches.
AbortingOr:
fatal: cannot checkout sparse checkout with dirty worktree
fatal: sparse checkout: failed to update working treeWhy Sparse Checkout Fails
Common causes:
- Dirty worktree - Uncommitted changes conflict with sparse update
- Incorrect pattern syntax - Cone mode uses different patterns than legacy
- Missing sparse-checkout file - Configuration not properly initialized
- Pattern doesn't match - Specified paths don't exist or pattern is wrong
- Branch has different structure - Files exist differently across branches
- Skip-worktree conflicts - Files marked skip-worktree have changes
Diagnosis Steps
Check sparse checkout status:
``bash
git sparse-checkout list
Shows current patterns.
Check sparse checkout configuration:
``bash
git config --get core.sparseCheckout
git config --get core.sparseCheckoutCone
View sparse checkout file:
``bash
cat .git/info/sparse-checkout
Check skip-worktree bits:
``bash
git ls-files -v | grep '^S'
Files with 'S' prefix have skip-worktree flag.
Verify patterns match files:
``bash
ls -la src/app/
git ls-tree -r HEAD --name-only | grep -E "src/app"
Solution 1: Fix Dirty Worktree Before Sparse Checkout
Sparse checkout updates conflict with uncommitted changes:
git sparse-checkout set src/apperror: Your local changes would be overwritten by sparse checkout updateStash changes first:
``bash
git stash push -m "before sparse checkout"
git sparse-checkout set src/app
git stash pop
Or commit changes:
``bash
git add .
git commit -m "WIP: before sparse checkout"
git sparse-checkout set src/app
Or discard changes:
``bash
git checkout -- .
git sparse-checkout set src/app
Solution 2: Initialize Sparse Checkout Properly
Correct initialization sequence:
```bash # For new clone git clone --filter=blob:none --sparse <url> cd repo git sparse-checkout set src/app
# For existing repo git sparse-checkout init git sparse-checkout set src/app git checkout ```
Using cone mode (recommended):
``bash
git sparse-checkout init --cone
git sparse-checkout set src/app src/lib
Solution 3: Fix Pattern Syntax Issues
Cone mode patterns differ from legacy:
Cone mode (simple directories):
``bash
git sparse-checkout init --cone
git sparse-checkout set src/app docs
Just directory names, no glob patterns.
Legacy mode (full patterns):
``bash
git sparse-checkout init --no-cone
echo "src/app/*" >> .git/info/sparse-checkout
echo "docs/**" >> .git/info/sparse-checkout
git checkout
Common pattern mistakes:
| Cone Mode | Legacy Mode | Note |
|---|---|---|
src/app | src/app/* | Cone uses directory name |
docs | docs/** | Cone simpler |
lib | /lib/* | Cone doesn't need leading / |
| Not supported | *.js | Cone can't use globs |
Solution 4: Fix Skip-Worktree Conflicts
Files marked skip-worktree have local changes that conflict:
git ls-files -v | grep '^S'Remove skip-worktree flag:
``bash
git update-index --no-skip-worktree src/test.js
For all skip-worktree files:
``bash
git ls-files -v | grep '^S' | cut -c2- | while read f; do
git update-index --no-skip-worktree "$f"
done
Then apply sparse checkout:
``bash
git sparse-checkout reapply
Solution 5: Fix Non-Matching Patterns
When patterns don't match existing paths:
warning: sparse checkout: no entries selected
error: pattern 'src/app' does not match any filesVerify paths exist:
``bash
git ls-tree -r HEAD --name-only | head -20
Check directory structure:
``bash
ls -la
Correct the pattern:
``bash
# If structure is app/src, not src/app
git sparse-checkout set app/src
Or use broader pattern:
``bash
git sparse-checkout set src
Solution 6: Disable and Re-enable Sparse Checkout
When sparse checkout state is corrupted:
```bash # Disable sparse checkout git sparse-checkout disable
# Verify all files present git checkout HEAD -- .
# Reinitialize git sparse-checkout init --cone git sparse-checkout set src/app ```
Solution 7: Handle Branch Structure Differences
When different branches have different file locations:
git checkout feature-branchSparse checkout patterns may not match new structure.
Update patterns for branch:
``bash
git sparse-checkout set feature-src/app
Or use patterns that work across branches:
``bash
git sparse-checkout set src app
Solution 8: Manual Sparse Checkout File Editing
For complex patterns beyond cone mode:
git sparse-checkout init --no-cone
cat > .git/info/sparse-checkout << 'EOF'
src/app/**
src/lib/**
docs/*.md
*.json
EOF
git checkoutVerify patterns applied:
``bash
git sparse-checkout list
Solution 9: Use Add Instead of Set
Add patterns without replacing existing:
git sparse-checkout init --cone
git sparse-checkout set src/app
git sparse-checkout add src/lib
git sparse-checkout add docsVerification
Verify sparse checkout applied:
``bash
ls -la
Should show only specified directories.
Verify patterns:
``bash
git sparse-checkout list
Shows active patterns.
Check skip-worktree flags:
``bash
git ls-files -v
Files outside patterns have 'S' prefix.
Verify files are present:
``bash
ls src/app/
cat src/app/main.js
Should work without errors.
Verify checkout works:
``bash
git checkout HEAD~1
git checkout main
Should update only sparse checkout files.
Sparse Checkout Commands Reference
```bash # Initialize sparse checkout git sparse-checkout init [--cone|--no-cone]
# Set patterns (replaces existing) git sparse-checkout set <patterns>
# Add patterns (keeps existing) git sparse-checkout add <patterns>
# List current patterns git sparse-checkout list
# Reapply patterns after changes git sparse-checkout reapply
# Disable sparse checkout git sparse-checkout disable
# Check status git sparse-checkout check ```
Cone Mode vs Legacy Mode
Cone mode (recommended): - Simpler syntax: just directory names - Faster checkout operations - Built-in pattern validation - No glob patterns needed
git sparse-checkout init --cone
git sparse-checkout set src docsLegacy mode: - Full pattern syntax - Globs and wildcards supported - More complex patterns possible - Slower operations
git sparse-checkout init --no-cone
echo "src/**/*.js" >> .git/info/sparse-checkout
git checkoutBest Practices
Use cone mode when possible:
``bash
git sparse-checkout init --cone
Simpler and faster.
Combine with partial clone:
``bash
git clone --filter=blob:none --sparse <url>
git sparse-checkout set src
Minimizes initial download.
Add patterns incrementally:
``bash
git sparse-checkout set src/app
git sparse-checkout add src/lib
Expand scope as needed.
Reapply after merge/rebase:
``bash
git merge main
git sparse-checkout reapply
Common Scenarios
CI with sparse checkout:
``bash
git clone --sparse $REPO_URL
git sparse-checkout set src tests
npm install
npm test
Large monorepo subset:
``bash
git clone --filter=blob:none --sparse https://company.com/monorepo.git
git sparse-checkout init --cone
git sparse-checkout set projects/my-project
Working on multiple components:
``bash
git sparse-checkout set src/app src/lib docs
git sparse-checkout add src/tests