Skip to content

[FEATURE] Use sparse checkout for plugin installs — only fetch shipping assets, not entire repo #2399

@ViktorHofer

Description

@ViktorHofer

Problem Statement

When GitHub Copilot CLI installs a plugin, it performs a full git clone of the source repository. This means every file in the repo — tests, CI configs, development tooling, documentation source, images, etc. — is downloaded to the user's machine, even though only the plugin directory is a shipping asset.

This has two problems:

  1. Performance: Full clones are unnecessarily slow and disk-heavy, especially for monorepos or repos with large non-plugin content (media, test fixtures, etc.).

  2. Shipping asset boundary (more important): Files outside the plugin directory are development artifacts — tests, .github/ workflows, .config/, contributor docs, build scripts, etc. These are not intended to be distributed to end users. Fetching them conflates "installing a plugin" with "cloning a development environment." Plugin consumers should only receive what plugin authors intend to ship.

Proposed Solution

Use Git's partial clone + sparse checkout to fetch only the plugin subdirectory:

# 1. Partial clone — no blobs downloaded yet
git clone --filter=blob:none --sparse --depth=1 <repo-url>
cd <repo>

# 2. Sparse checkout — only materialize the plugin path
git sparse-checkout set <plugin-path>
Flag Effect
--filter=blob:none Partial clone — skips downloading file content until needed
--sparse Enables sparse checkout (only root files initially)
--depth=1 Shallow — only the latest commit, no history

This is well-supported by GitHub's servers and requires Git 2.25+.

Alternative Solutions

Approach Downside
Full clone (status quo) Downloads non-shipping content; slower
--depth=1 only (shallow clone) Still downloads all files across the tree
Download tarball of subdirectory via GitHub API Loses git-based update/ref mechanism

Additional Context

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions