Skip to content

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