Skip to content
Latchkey

git sparse-checkout --cone: Partial Checkouts in CI

git sparse-checkout in cone mode (the default since Git 2.27) restricts the working tree to chosen directories, so a monorepo job only materializes the paths it needs.

For a monorepo, checking out everything wastes runner time and disk. Cone-mode sparse-checkout limits the working tree to a set of directories using fast directory-prefix matching instead of arbitrary patterns.

What it does

git sparse-checkout set <dirs> writes a sparse pattern set and updates the working tree to contain only those directories (plus files at the repo root). Cone mode (--cone, default) restricts patterns to directory prefixes, which is far faster than full pattern matching on large trees. Combine with a partial clone (--filter=blob:none) to also skip downloading unneeded blobs.

Common usage

Terminal
git clone --filter=blob:none --no-checkout https://github.com/org/monorepo
cd monorepo
git sparse-checkout init --cone
git sparse-checkout set services/api libs/common
git checkout main
# inspect / widen later
git sparse-checkout list
git sparse-checkout add tools/ci

Options

Command / flagWhat it does
init --coneEnable sparse-checkout in cone (directory) mode
set <dir>...Replace the set of included directories
add <dir>...Add directories to the existing set
listShow the current sparse patterns
reapplyRe-evaluate patterns against the index
disableTurn sparse-checkout off and check out everything

In CI

Pair --filter=blob:none --no-checkout with sparse-checkout so the clone skips both unneeded blobs and unneeded files: a big win on monorepo runners. Note actions/checkout exposes a sparse-checkout input that runs these commands for you. Files at the repo root are always included regardless of the set.

Common errors in CI

"warning: disabling cone pattern matching" means a pattern you added is not a plain directory prefix; cone mode only takes directories. "fatal: this operation must be run in a work tree" appears if you ran set in a bare repo. If expected files are missing, the directory is simply not in the set; git sparse-checkout add it.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →