Редкие проверки - как это работает

Я искал способ клонировать только подкаталог одного из моих проектов. Очевидно, я нашел этот ответ. он хорошо спроектирован, и пошаговое решение хорошо объясняет, как это реализовать. Теперь в конце это относится к документации, в которой говорится:

"Разреженная проверка" позволяет редко заполнять рабочий каталог. Он использует бит 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 копирует только некоторые из подкаталогов или файлов. Таким образом, скудный контроль экономит пространство рабочей зоны. Занимаемое пространство базой данных не сохраняется.

Другие вопросы по тегам