Partial clone and promisor remote — quick reference
Clone types
| Command |
Downloads |
Use for |
git clone --filter=blob:none <url> |
Commits + trees; blobs on demand |
Developer workstations |
git clone --filter=tree:0 <url> |
Commits only; trees + blobs on demand |
CI pipelines, stateless checks |
git clone --filter=blob:limit=1m <url> |
Blobs < 1 MB; larger on demand |
Mixed-source monorepos |
git clone <url> (no filter) |
Everything |
Full offline access |
Inspect promisor status
# Check if repo is partial clone
git rev-list --missing=print --all --objects | head -5
# Count missing objects
git rev-list --missing=print --all --objects | wc -l
# List promisor remotes
git config --no-type --list | grep promisor
# Verify extension enabled
git config extensions.partialClone
# Check remote filter setting
git config remote.origin.partialclonefilter
Force materialization
# Pre-fetch blobs for a path
git checkout HEAD -- src/services/auth/
git reset HEAD -- src/services/auth/
# Full promisor re-fetch (ignores local store)
git fetch --refetch origin
# Re-fetch all promisor remotes
git fetch --refetch --all
Maintenance
git maintenance start # background prefetch + repack
git config fetch.negotiationAlgorithm skipping # faster negotiation
git fsck --connectivity-only --no-dangling # safe check in partial clones
Troubleshooting
# "bad object deadbeef" — promisor unreachable
git config remote.origin.promisor false
git fetch --refetch origin
git config remote.origin.promisor true
# Server doesn't support filters (protocol v2)
git clone <url> repo # drop --filter, full clone
# Check protocol version
git ls-remote --refs origin 2>&1 | head -3
Promisor config keys
| Setting |
Purpose |
remote.origin.promisor = true |
Marks remote as promisor source |
remote.origin.partialclonefilter = blob:none |
Filter on promisor fetches |
extensions.partialClone = origin |
Enables partial clone repo-wide |
fetch.negotiationAlgorithm = skipping |
Fast ref negotiation |
protocol.version = 2 |
Required for filter support |