Редкие проверки - как это работает
Я искал способ клонировать только подкаталог одного из моих проектов. Очевидно, я нашел этот ответ. он хорошо спроектирован, и пошаговое решение хорошо объясняет, как это реализовать. Теперь в конце это относится к документации, в которой говорится:
"Разреженная проверка" позволяет редко заполнять рабочий каталог. Он использует бит skip-worktree (см. Git-update-index(1)), чтобы сообщить Git, стоит ли искать файл в рабочем каталоге.
У меня проблема в том, что я не могу понять, что это значит. И одна вещь, которую я узнал с Git, это то, что это фантастический инструмент, но прежде чем что-то реализовывать, знание того, что происходит за кулисами, может действительно помочь вам в долгосрочной перспективе.
Итак, вот вопрос:
Как работает редкая проверка и каков результат?
2 ответа
Новая команда ( представленная в Git 2.25 (1 квартал 2020 г.)) появилась благодаря вкладу Microsoft, основанному на ее проектеScalar .
В Microsoft мы поддерживаем репозиторий ОС Windows , используя VFS для Git (ранее GVFS). VFS для Git использует виртуализированную файловую систему, чтобы обойти многие предположения о размере репозитория, позволяя разработчикам Windows использовать Git в масштабах, которые ранее считались невозможными.
Поддерживая VFS для Git, мы выявили узкие места в производительности с помощью пользовательской системы трассировки и сбора отзывов пользователей.
Мы внесли несколько дополнений в клиент Git, включая файл графика коммитов и улучшения вgit push
а также.Основываясь на этих вкладах и многих других недавних улучшениях Git, мы начали проект по поддержке очень больших репозиториев без необходимости использования виртуализированной файловой системы.
Отсюда и проект Scalar , который (в середине 2021 года) перешел от модифицированной версии VFS для Git к тонкой оболочке вокруг основных функций Git.
Исполняемый файл Scalar теперь портирован для включения в вилку microsoft/git .
В статье Уменьшите размер монорепозитория с помощью разреженной проверки » от 2020 года объясняется, как в наши дни (2020+) управляется разреженная проверка.
Использование с существующим репозиторием
Чтобы ограничить рабочий каталог набором каталогов, выполните следующие команды:
git sparse-checkout init --cone git sparse-checkout set <dir1> <dir2> ...
Если вы застряли, бегите
git sparse-checkout disable
чтобы вернуться в полный рабочий каталог.The
init
Подкоманда устанавливает необходимые параметры конфигурации Git и заполняет файл шаблонами, которые означают «сопоставлять файлы только в корневом каталоге».The
set
подкоманда изменяетsparse-checkout
файл с шаблонами, чтобы соответствовать файлам в заданных каталогах.
Кроме того, также включаются любые файлы, находящиеся непосредственно в каталоге, являющемся родительским по отношению к указанному каталогу.Например, если вы побежали
git sparse-checkout set A/B
, тогда Git будет включать файлы с именамиA/B/C.txt
(непосредственный ребенок ) иA/D.txt
(прямой братA/B
) так же какE.txt
(прямой братA
).
Например:
Команда, разрабатывающая приложение для Android, обычно может обойтись только файлами в
client/android
и запустите все интеграционные тесты с уже развернутыми сервисами.Команде Android нужен гораздо меньший набор файлов для работы.
Это означает, что они могут использоватьgit sparse-checkout set
команда для ограничения этого каталога:
$ git sparse-checkout set client/android
$ ls
bootstrap.sh* client/ LICENSE.md README.md
$ ls client/
android/
$ find . -type f | wc -l
62
git sparse-checkout
использует разреженный индекс, начиная с Git 2.32 (1 квартал 2021 г.).
См. статью Сделайте монорепозиторий маленьким с помощью разреженного индекса Git » . Деррика Столи «Деррика Столи «
Разреженный индекс отличается от обычного «полного» индекса одним аспектом: он может хранить пути к каталогам с идентификатором объекта для своего объекта дерева .
Это в дополнение к путям к файлам, которые связаны с объектами больших двоичных объектов.
Поскольку шаблоны разреженной проверки конусного режима совпадают на уровне каталога, мы можем определить, что весь каталог находится за пределами конуса разреженной проверки, и заменить все содержащиеся в нем пути к файлам одним путем к каталогу.
Записи разреженного каталога соответствуют каталогам, которые находятся за пределами определения разреженной проверки.
Эти каталоги также имеют узел кэш-дерева, диапазон которого состоит только из одной записи: этой разреженной записи каталога.
С Git 2.36 (второй квартал 2022 г.) " git update-index
" ( мужчина ) ", " git checkout-index
" ( мужчина ) и" git clean
" ( мужчину ) учат лучше работать с функцией разреженной проверки.
См. коммит b9ca5e2, , коммит e015d4d, коммит 35682ad, коммит 88078f5, коммит b553ef6, коммит 1e9e10e, коммит 1624333, коммит bb01b26 (11 января 2022 г.) Виктории Дай (
vdye
) .
(Объединено Junio C Hamano --
gitster
-- в коммите 2f45f3e, 17 февраля 2022 г.)
коммит c35e9f5: интеграция с разреженным индексом
Подписано: Виктория Дай
Рецензировано: Элайджа Ньюрен
Включите использование разреженного индекса с .
Большинство вариацийupdate-index
работать без явного расширения индекса или каких-либо других обновлений внутри или внеupdate-index.c
.Одно использование, требующее дополнительных изменений, это
--cacheinfo
; если был указан файл внутри разреженного каталога, индекс не будет расширен до тех пор, пока дерево кеша не станет недействительным, что приведет к несоответствию между индексом и деревом кеша.
Этот сценарий обрабатывается перестановкойadd_index_entry_with_check
, позволяяindex_name_stage_pos
для расширения индекса перед попыткой сделать недействительным соответствующий путь к дереву кеша, избегая повреждения дерева кеша/индекса.
Коммит указывает на дерево. Дерево описывает каталог и указывает на другие деревья, BLOB-объекты или коммиты. Другие деревья являются подкаталогами. BLOB-файлы - это файлы. Коммиты являются субмодулями. Не учитывая субмодули, git checkout
можно рассматривать как "копирование" всех этих подкаталогов и файлов из базы данных (внутри невидимого каталога .git
) в рабочую область (по умолчанию тот же уровень, где .git
является). Sparse-checkout копирует только некоторые из подкаталогов или файлов. Таким образом, скудный контроль экономит пространство рабочей зоны. Занимаемое пространство базой данных не сохраняется.