Какой флаг использовать в git clone для минимального использования дискового пространства
Что проверяют
Знаете ли вы про поверхностный клон, а в идеале и про частичный. Короткий ответ --depth 1 засчитают, но следом спросят, что вы при этом теряете и чем --depth отличается от --filter.
Как отвечать
Базовый ответ: git clone --depth 1 <url> создаёт поверхностный (shallow) клон только с последним коммитом. Этот флаг заодно включает --single-branch, поэтому другие ветки не скачиваются. Для разовой сборки в CI или в Dockerfile этого достаточно.
Дальше покажите, что знаете остальные варианты:
- частичный клон:
--filter=blob:noneскачивает всю историю коммитов и деревьев, а содержимое файлов подтягивает по мере надобности.git logработает полностью, а места нужно заметно меньше.--filter=tree:0экономит ещё сильнее, но тормозит на операциях с историей. Фильтрацию должен поддерживать сервер, крупные хостинги её поддерживают; - разреженный checkout:
--sparseвместе сgit sparse-checkout set <каталог>оставляет в рабочей копии только нужные каталоги монорепозитория; - без рабочей копии:
--no-checkoutили--bare, если нужны только объекты; - дозагрузка:
git fetch --deepen=Nилиgit fetch --unshallow, если истории понадобилось больше.
Для минимума места флаги комбинируют: --depth 1 --filter=blob:none --sparse.
У Python-проекта есть свой подводный камень: setuptools-scm вычисляет версию пакета по тегам и истории. В поверхностном клоне тегов нет, и версия превращается в заглушку вроде 0.1.dev1. В GitHub Actions actions/checkout по умолчанию клонирует с глубиной 1, поэтому для сборки пакета ставят fetch-depth: 0.
Где спотыкаются
Не знают, что --depth включает --single-branch, и удивляются, что после клонирования нет других веток.
Не слышали о частичном клоне и не могут объяснить, почему для работы с историей --filter=blob:none удобнее, чем --depth 1.
Используют shallow-клон там, где нужны история или теги: git describe, git blame, вычисление версии. Результат молча оказывается неверным.