Тур по Git
Продвинутый Git / Урок 5.15

Разреженное извлечение и частичное клонирование

Большие репозитории — особенно монорепозитории — могут содержать тысячи директорий и миллионы файлов. Если вам нужна только небольшая часть, скачивание всего расточительно. Разреженное извлечение (sparse checkout) и частичное клонирование (partial clone) позволяют работать только с нужными частями.

Разреженное извлечение (Sparse Checkout)

Sparse checkout указывает Git заполнять вашу рабочую директорию только конкретными директориями или файлами. Остальные данные репозитория всё ещё находятся в .git, но файлы не извлекаются.

Настройка Sparse Checkout

# Инициализировать sparse checkout
git sparse-checkout init

# Выбрать, какие директории включить
git sparse-checkout set src/ docs/ README.md

После этого только src/, docs/ и README.md будут отображаться в вашей рабочей директории. Всё остальное скрыто.

Просмотр и изменение выбора

# Посмотреть, что сейчас извлечено
git sparse-checkout list

# Добавить ещё директории
git sparse-checkout add tests/

# Вернуться к полному извлечению
git sparse-checkout disable

Конусный и неконусный режимы

Sparse checkout имеет два режима:

Конусный режим (по умолчанию, рекомендуется)

git sparse-checkout init --cone
git sparse-checkout set src/frontend src/shared

Конусный режим работает только с шаблонами директорий. Он быстрее и проще — вы указываете директории, и Git включает все файлы внутри них.

Неконусный режим

git sparse-checkout init --no-cone

Неконусный режим поддерживает произвольные шаблоны в стиле .gitignore:

# .git/info/sparse-checkout
/*
!/*/
/src/
/docs/*.md

Неконусный режим более гибкий, но медленнее, потому что Git должен проверять шаблоны для каждого пути файла.

АспектКонусный режимНеконусный режим
Тип шаблоновТолько директорииШаблоны в стиле gitignore
ПроизводительностьБыстрыйМедленнее на больших репозиториях
ПростотаЛегко понятьСложный синтаксис шаблонов
РекомендацияИспользуйте по умолчаниюТолько когда нужны шаблоны на уровне файлов

Частичное клонирование (Partial Clone)

Sparse checkout контролирует, какие файлы появляются в рабочей директории, но вы всё равно скачиваете все объекты Git при git clone. Частичное клонирование идёт дальше — оно пропускает загрузку ненужных объектов.

Клонирование без блобов

git clone --filter=blob:none https://github.com/example/large-repo.git

Это скачивает коммиты и деревья, но пропускает содержимое файлов (блобы). Git загружает блобы по требованию при извлечении файлов. Это значительно сокращает время первоначального клонирования и использование диска.

Клонирование без деревьев

git clone --filter=tree:0 https://github.com/example/large-repo.git

Это пропускает и деревья, и блобы. Ещё быстрее, но некоторые операции могут вызвать больше загрузок по требованию.

Совмещение Sparse Checkout и Partial Clone

Наиболее эффективный рабочий процесс для больших репозиториев совмещает оба подхода:

# 1. Частичное клонирование — скачать только метаданные коммитов
git clone --filter=blob:none --sparse https://github.com/example/monorepo.git
cd monorepo

# 2. Sparse checkout — выбрать нужные директории
git sparse-checkout set services/auth libs/shared

# 3. Работайте как обычно — Git загружает блобы по мере необходимости
git log
git diff

Таким образом вы скачиваете только данные для директорий, в которых фактически работаете.

Сценарии использования

  • Монорепозитории — фронтенд-разработчик извлекает только frontend/ и shared/
  • Большие репозитории — экономия дискового пространства и времени клонирования для репозиториев с обширной историей
  • CI/CD — пайплайны сборки, которым нужны только определённые директории
  • Онбординг — новые разработчики начинают работу быстрее с целенаправленным извлечением

Ключевые моменты

  • git sparse-checkout set <dirs> ограничивает рабочую директорию конкретными директориями
  • Конусный режим (только директории) проще и быстрее неконусного режима
  • git clone --filter=blob:none пропускает загрузку содержимого файлов до востребования
  • Совмещайте sparse checkout с partial clone для лучшей производительности на больших репозиториях
  • Используйте git sparse-checkout disable для возврата к полному извлечению