Git разреженные проверки с исключением
Согласно этой теме, исключение в Git's sparse-checkout
Функция должна быть реализована. Это?
Предположим, что у меня есть следующая структура:
papers/
papers/...
presentations/
presentations/heavy_presentation
presentations/...
Теперь я хочу исключить presentations/heavy_presentation
от кассы, оставляя остальные в кассе. Мне не удалось запустить это. Какой правильный синтаксис для этого?
6 ответов
Я бы ожидал что-то вроде ниже, чтобы работать:
/*
!presentations/heavy_presentation
Но это не так. И я попробовал много других комбинаций. Я думаю, что исключение не реализовано должным образом и есть ошибки вокруг него (все еще)
Что-то вроде:
presentations/*
!presentations/heavy_presentation
работает, и вы получите папку с презентациями без папки heavy_presentation.
Таким образом, обходной путь должен включать все остальное в явном виде.
К сожалению, ничего из вышеперечисленного не помогло мне, поэтому я потратил очень много времени, пытаясь использовать различные комбинации sparse-checkout
файл.
В моем случае я хотел пропустить папки с конфигами IntelliJ IDEA.
Вот что я сделал:
Бежать git clone https://github.com/myaccount/myrepo.git --no-checkout
Бежать git config core.sparsecheckout true
созданный .git\info\sparse-checkout
со следующим содержанием
!.idea/*
!.idea_modules/*
/*
Запустите "git checkout -", чтобы получить все файлы.
Критическая вещь, чтобы заставить это работать, должна была добавить /*
после имени папки.
У меня есть мерзавец 1.9
В Git 2.25 (первый квартал 2020 г.) Управление редко проверяемым рабочим деревом получило выделенныйsparse-checkout
"команда.
(Подробнее см. В разделе " Уменьшите размер монорепозитория сsparse-checkout
"от
Деррика Столи)
Таким образом, не только исключение подпапки действительно работает, но оно будет работать быстрее в режиме "конуса" разреженной проверки (с Git 2.25).
См. Коммит 761e3d2 (20 декабря 2019 г.) Эд Масте (emaste
).
См фиксации 190a65f (13 дек 2019), а также совершать cff4e91, совершают 416adc8, совершают f75a69f, совершают fb10ca5, совершают 99dfa6f, совершают e091228, совершают e9de487, совершают 4dcd4de, совершают eb42fec, совершают af09ce2, совершают 96cc8ab, совершают 879321e, совершают 72918c1, совершают 7bffca9, фиксация f6039a9, фиксация d89f09c, фиксация bab3c35, фиксация 94c0956(21 ноя 2019) Деррик Столи (derrickstolee
).
См. Коммит e6152e3 (21 ноября 2019 г.) Джеффа Хостетлера (Jeff-Hostetler
).
(Слияние Junio C Hamano -gitster
- в коммите bd72a08, 25 декабря 2019 г.)
sparse-checkout
: добавить режим конусаПодписано: Деррик Столи
Функция разреженной проверки может иметь квадратичную производительность по мере увеличения количества шаблонов и количества записей в индексе.
Если имеется 1000 шаблонов и 1000000 записей, это время может быть очень значительным.Создайте новый логический параметр конфигурации, core.sparseCheckoutCone, чтобы указать, что мы ожидаем, что файл разреженной проверки будет содержать более ограниченный набор шаблонов.
Это отдельный параметр конфигурации изcore.sparseCheckout
чтобы избежать поломки старых клиентов, введя вариант с тремя состояниями.
В config
страница руководства включает:
`core.sparseCheckoutCone`:
Включает " режим конуса " функции разреженной проверки.
Когда файл разреженной проверки содержит ограниченный набор шаблонов, этот режим обеспечивает значительные преимущества в производительности.
В git sparse-checkout
детали страницы руководства:
КОНУСНЫЙ УЗОР
Полный набор шаблонов допускает произвольные совпадения шаблонов и сложные правила включения / исключения.
Это может привести кO(N*M)
шаблон соответствует при обновлении индекса, гдеN
количество паттернов иM
количество путей в индексе. Для решения этой проблемы с производительностью допускается более ограниченный набор шаблонов, когдаcore.spareCheckoutCone
включен.Допустимые шаблоны в наборе шаблонов конусов:
- Рекурсивный: включены все пути внутри каталога.
- Родитель: включаются все файлы, находящиеся непосредственно в каталоге.
В дополнение к двум вышеупомянутым шаблонам мы также ожидаем, что будут включены все файлы в корневом каталоге. Если добавляется рекурсивный шаблон, то все ведущие каталоги добавляются как родительские шаблоны.
По умолчанию при запуске
git sparse-checkout init
, корневой каталог добавляется как родительский шаблон. На этом этапе файл разреженной проверки содержит следующие шаблоны:/* !/*/
Это говорит: "Включайте все в корень, но ничего на два уровня ниже корня".
Если потом добавить папкуA/B/C
как рекурсивный шаблон, папкиA
а такжеA/B
добавляются как родительские шаблоны.
Полученный в результате файл разреженной проверки теперь/* !/*/ /A/ !/A/*/ /A/B/ !/A/B/*/ /A/B/C/
Здесь порядок имеет значение, поэтому негативные шаблоны перекрываются позитивными шаблонами, которые появляются ниже в файле.
Если
core.sparseCheckoutCone=true
, то Git проанализирует файл разреженной проверки, ожидая шаблонов этих типов.
Git предупредит, если шаблоны не совпадают.
Если шаблоны действительно соответствуют ожидаемому формату, то Git будет использовать более быстрые алгоритмы на основе хеширования для вычисления включения вsparse-checkout
.
Так:
sparse-checkout
: init и установить в режиме конусаПомощник: Эрик Вонг.
Помощник: Йоханнес Шинделин.
Подпись: Деррик Столи.Чтобы упростить использование набора шаблонов конусов, обновите поведение '
git sparse-checkout (init|set)
'.Добавить '
--cone
'флаг'git sparse-checkout init
'установить опцию конфигурации'core.sparseCheckoutCone=true
'.При беге '
git sparse-checkout set
'в режиме конуса пользователю нужно только предоставить список рекурсивных совпадений папок. Git автоматически добавит необходимые родительские совпадения для ведущих каталогов.При тестировании '
git sparse-checkout set
'в режиме конуса проверьте поток ошибок, чтобы убедиться, что мы не видим никаких ошибок.
В частности, мы хотим избежать предупреждения о том, что шаблоны не соответствуют шаблонам конусного режима.
Обратите внимание --cone
опция задокументирована только в Git 2.26 (Q1 2020)
См. Фиксацию d031049, фиксацию a402723 (23 января 2020 г.) Матеус Таварес (matheustavares
).
(Слияние Junio C Hamano -gitster
- в коммите ea46d90, 05 февраля 2020 г.)
doc
:sparse-checkout
: упомянуть--cone
вариантПодписано: Матеус Таварес.
Подпись: Деррик Столи.В af09ce2 ("
sparse-checkout
: init и установить в режиме конуса ", 2019-11-21, Git v2.25.0-rc0 - слияние), '--cone
'опция была добавлена в'git sparse-checkout
в этом'.Задокументируйте это в
git sparse-checkout
:
Это включает:
когда
--cone
предоставляется,core.sparseCheckoutCone
также установлена настройка, позволяющая повысить производительность с ограниченным набором шаблонов.
("набор шаблонов", представленный выше, в "CONE PATTERN SET
"раздел этого ответа)
Насколько быстрее будет этот новый "конический" режим?
sparse-checkout
: использовать хэш-карты для шаблонов конусовПомощник: Эрик Вонг.
Помощник: Йоханнес Шинделин.
Подпись: Деррик Столи.Родительские и рекурсивные шаблоны, разрешенные параметром "cone mode" в sparse-checkout, достаточно ограничительны, чтобы мы могли избежать использования синтаксического анализа регулярных выражений. Все основано на совпадении префиксов, поэтому мы можем использовать хеш-наборы для хранения префиксов из файла sparse-checkout. При проверке пути мы можем удалить записи пути из пути и проверить хэш-набор на точное совпадение.
В качестве теста я создал файл разреженной проверки в режиме конуса для репозитория Linux, который фактически включает каждый файл. Это было создано путем взятия каждой папки в репозитории Linux и создания здесь пар шаблонов:
/$folder/ !/$folder/*/
В результате получился файл с разреженными проверками с 8296 шаблонами.
Выполнение git read-tree -mu HEAD для этого файла имело следующие характеристики:core.sparseCheckout=false: 0.21 s (0.00 s) core.sparseCheckout=true: 3.75 s (3.50 s)
core.sparseCheckoutCone = true: 0,23 с (0,01 с)
Время в скобках выше соответствует времени, проведенному в первом
clear_ce_flags()
звоните, согласноtrace2
следы производительности.Хотя этот пример надуман, он демонстрирует, как эти шаблоны могут замедлить работу функции разреженной проверки.
А также:
sparse-checkout
: уважать core.ignoreCase в режиме конусаПодписано: Деррик Столи
Когда пользователь использует функцию разреженного оформления заказа в режиме конуса, он добавляет шаблоны, используя "
git sparse-checkout set <dir1> <dir2> ...
"или с помощью"--stdin
"для построчного предоставления каталогов по стандартному вводу.
Это поведение, естественно, очень похоже на то, как пользователь вводит"git add <dir1> <dir2> ...
"Если
core.ignoreCase
включен, то "git add
"будет соответствовать входным данным без учета регистра.
Сделайте то же самое дляsparse-checkout
характерная черта.Выполнять проверки без учета регистра при обновлении битов skip-worktree во время
unpack_trees()
. Это делается путем изменения алгоритма хеширования и методов сравнения хэш-карт, чтобы можно было использовать методы без учета регистра.Когда этот параметр включен, алгоритм хеширования снижает производительность.
Чтобы выявить наихудший случай, в репозитории с глубокой структурой каталогов было выполнено следующее:git ls-tree -d -r --name-only HEAD | git sparse-checkout set --stdin
Команда 'set' была приурочена к
core.ignoreCase
отключено или включено.
Для репо с глубокой историей цифры былиcore.ignoreCase=false: 62s core.ignoreCase=true: 74s (+19.3%)
Для воспроизводимости эквивалентный тест в репозитории ядра Linux имел следующие номера:
core.ignoreCase=false: 3.1s core.ignoreCase=true: 3.6s (+16%)
Это не совсем справедливое сравнение, так как большинство пользователей будут определять свой разреженный конус, используя более мелкие каталоги, и улучшение производительности от eb42feca97 ("unpack-tree: hash less in cone mode" 2019-11-21, Git 2.25-rc0) может удалить большую часть стоимости хеширования. Для более реалистичного тестирования уберите "
-r
" отls-tree
команда для хранения только каталогов первого уровня.
В этом случае репозиторий ядра Linux занимает 0,2-0,25 секунды в каждом случае, а глубокий репозиторий занимает одну секунду, плюс-минус 0,05 секунды в каждом случае.Таким образом, мы можем продемонстрировать стоимость этого изменения, но вряд ли это будет иметь значение для какого-либо разумного конуса с разреженными кассами.
С Git 2.25 (первый квартал 2020 г.) " git sparse-checkout
Подкоманда list"научилась выдавать свой вывод в более сжатой форме, когда действует режим" конус ".
См. Commit 4fd683b, commit de11951 (30 декабря 2019 г.) Деррик Столи (derrickstolee
).
(Слияние Junio C Hamano -gitster
- в коммите c20d4fd, 06 января 2020 г.)
sparse-checkout
: список каталогов в режиме конусаПодписано: Деррик Столи
когда
core.sparseCheckoutCone
включен, 'git sparse-checkout set
'принимает список каталогов в качестве входных данных, а затем создает упорядоченный список шаблонов разреженного извлечения, так что эти каталоги рекурсивно включаются, и все родственные записи в родительских каталогах также включаются.
Перечисление шаблонов менее удобно, чем сами каталоги.В режиме конуса и до тех пор, пока шаблоны соответствуют ожидаемым типам шаблонов режима конуса, измените вывод '
git sparse-checkout list
', чтобы показать только каталоги, в которых были созданы шаблоны.С этим изменением следующие переданные по конвейеру команды не изменят рабочий каталог:
git sparse-checkout list | git sparse-checkout set --stdin
Единственный раз, когда это не сработает, это если
core.sparseCheckoutCone
являетсяtrue
, но файл разреженной проверки содержит шаблоны, которые не соответствуют ожидаемым типам шаблонов для режима конуса.
При записи этого конуса в файл будет использоватьсяstring_list_sort()
, который лучше документирован в Git 2.25.1 (февраль 2020 г.).
См. Commit 065027e (7 января 2020 г.) Элайджа Ньюрен (newren
).
(Слияние Junio C Hamano -gitster
- в коммите 1f10b84, 22 января 2020 г.)
string-list
: обратите внимание в документах, что вызывающие абоненты могут указывать функцию сортировкиПодписано: Элайджа Ньюрен
В коммите 1959bf6430 (
string_list
API: документируйте, что означает "отсортированный", 2012-09-17, Git v1.8.0-rc0),Documentation/technical/api-string-list.txt
был обновлен, чтобы указать, чтоstrcmp()
использовался для сортировки.При фиксации 8dd5afc926 ("
string-list
: разрешить список строк без учета регистра ", 2013-01-07, Git v1.8.2-rc0 - merge), acmp
член был добавлен в структуруstring_list
чтобы позволить вызывающим абонентам указать альтернативную функцию сравнения, ноapi-string-list.txt
не обновлялся.В коммите 4f665f2cf3 ("
[
строка-список.h](https
://github.com/git/git/blob/065027ee1a7b3ecc45b6d331983d38642835c451/string-list.h): переместить документацию из Documentation/api/ в заголовок ", 2017-09-26, Git v2.15.0-rc0 - слияние указано в batch #12) устаревшая документация api-string-list.txt была перемещена вstring-list.h
.Обновите документы, чтобы отразить настраиваемость сортировки.
/** * The string_list API offers a data structure and functions to handle * sorted and unsorted arrays of strings. A "sorted" list is one whose * entries are sorted by string value in the order specified by the `cmp` * member (`strcmp()` by default).
Код, недавно добавленный в этом выпуске для перехода к записи за пределами того же каталога в индексе в режиме разреженного конуса, не подсчитывал количество записей, которые нужно пропустить неправильно, что было исправлено в Git 2.25.1 (Февраль 2020 г.).
См. Commit 7210ca4 (27 января 2020 г.), автор Junio C Hamano (gitster
).
См. Коммит 4c6c797 (10 января 2020 г.) Деррика Столи через GitGitGadget (``).
(Слияние Junio C Hamano -gitster
- в коммите 043426c, 30 января 2020 г.)
unpack-trees
: правильно вычислить количество результатовАвтор отчета : Йоханнес Шинделин.
Подпись: Деррик Столи.В
clear_ce_flags_dir()
обрабатывает записи кеша в общем каталоге. Вернувшийсяint
это количество записей кэша, обработанных этим каталогом.
При использовании функции разреженной проверки в режиме конуса мы можем пропустить сопоставление с образцом для записей в каталогах, которые полностью включены или полностью исключены.eb42feca ("
unpack-trees
: hash less in cone mode", 2019-11-21, Git v2.25.0-rc0 - слияние, указанное в пакете №0) представила эту функцию повышения производительности. Старый механизм полагался на счетчики, возвращаемые при вызовеclear_ce_flags_1()
, но новый механизм рассчитал количество строк путем вычитания "cache_end
" из "cache
", чтобы найти размер диапазона.
Однако это уравнение неверно, потому что оно делится наsizeof(struct cache_entry *)
. Арифметика с указателями работает не так!В закрытой сборке Git для Windows при подготовке к выпуску 2.25.0 обнаружена эта проблема с предупреждением:
Pointer differences, such as `cache_end` - cache, are automatically scaled down by the size (8 bytes) of the pointed-to type (struct `cache_entry` *). Most likely, the division by sizeof(struct `cache_entry` *) is extraneous and should be eliminated.
Это предупреждение правильное.
Это оставляет нас с вопросом "как это вообще работало?"
Проблема, которая возникает с этой неправильной арифметикой указателя, связана только с производительностью, и притом очень незначительной.
Поскольку количество записей, возвращаемоеclear_ce_flags_dir()
уменьшается в 8 раз, цикл вclear_ce_flags_1()
повторно обработает записи из этих каталогов.Вставив глобальные счетчики в
unpack-tree.c
и отслеживая их с помощьюtrace2_data_intmax()
(в частном изменении, для тестирования) я смог подсчитать, сколько раз цикл внутриclear_ce_flags_1()
обработал запись и сколько разclear_ce_flags_dir()
назывался.
Каждый из них уменьшается как минимум в 8 раз с текущим изменением.
Коэффициент больше 8 возникает при повторении нескольких уровней каталогов.В частности, в репозитории ядра Linux команда
git sparse-checkout set LICENSES
ограничивает рабочий каталог только файлами в корневом каталоге и в каталоге LICENSES.
Вот измеренные значения:
clear_ce_flags_1
блоки петли:Before: 11,520 After: 1,621
clear_ce_flags_dir
звонки:Before: 7,048 After: 606
Хотя это драматические подсчеты, время, проведенное в
clear_ce_flags_1()
составляет менее одной миллисекунды в каждом случае, поэтому улучшение невозможно измерить как сквозное время.
В Git 2.26 (первый квартал 2020 г.) некоторые шероховатости в функции разреженной проверки, особенно в режиме конуса, были очищены.
См совершают f998a3f, совершают d2e65f4, совершают e53ffe2, совершают e55682e, совершают bd64de4, совершают d585f0e, совершают 4f52c2c, совершают 9abc60f (31 Jan 2020), а также совершать 9e6d3e6, совершают 41de0c6, совершают 47dbf10, совершают 3c75406, совершают d622c34, совершают 522e641 (24 Янв 2020), Деррик Столи (derrickstolee
).
См. Commit 7aa9ef2 (24 января 2020 г.) Джефф Кинг (peff
).
(Слияние Junio C Hamano -gitster
- в коммите 433b8aa, 14 февраля 2020 г.)
sparse-checkout
: исправить несоответствие поведения режима конусаАвтор отчета : Финн Брайант
Подписано: Деррик СтолиНазначение специального "режима конуса" в функции разреженной проверки состоит в том, чтобы всегда соответствовать тем же шаблонам, которым соответствует тот же самый файл разреженной проверки, что и при отключенном режиме конуса.
Если указан путь к файлу "
git sparse-checkout
set "в режиме конуса, то режим конуса неправильно соответствует файлу как рекурсивному пути.
При установке битов skip-worktree файлы не ожидалиMATCHED_RECURSIVE
ответ, и, следовательно, они были исключены из согласованного конуса.Исправьте эту ошибку, проверив
MATCHED_RECURSIVE
в добавление кMATCHED
и добавить тест, предотвращающий регресс.
Документация теперь включает:
когда
core.sparseCheckoutCone
включен, входной список считается списком каталогов, а не шаблонами разреженной проверки.
Команда записывает шаблоны в файл разреженного извлечения, чтобы включить все файлы, содержащиеся в этих каталогах (рекурсивно), а также файлы, которые являются родственниками каталогов-предков.
Входной формат соответствует выходномуgit ls-tree --name-only
. Это включает интерпретацию имен путей, которые начинаются с двойной кавычки ("
) как строки в кавычках в стиле C.
С Git 2.26 (первый квартал 2020 г.) "git sparse-checkout
"узнал новое"add
"подкоманда.
См. Фиксацию 6c11c6a (20 февраля 2020 г.) и фиксацию ef07659, фиксацию 2631dc8, фиксацию 4bf0c06, фиксацию 6fb705a (11 февраля 2020 г.) Деррика Столи (derrickstolee
).
(Слияние Junio C Hamano -gitster
- в коммите f4d7dfc, 05 мар 2020)
sparse-checkout
: создать подкоманду 'добавить'Подписано: Деррик Столи
При использовании функции разреженной проверки пользователь может захотеть постепенно увеличивать свой набор шаблонов разреженной проверки.
Разрешить добавление шаблонов с помощью новой подкоманды "добавить".Это не сильно отличается от подкоманды set, потому что мы все же хотим разрешить
--stdin
'и интерпретировать входные данные как каталоги в режиме конуса и шаблоны в противном случае.В режиме конуса мы выращиваем конус.
Это может фактически уменьшить набор шаблонов при добавлении каталогаA
когдаA/B
уже является каталогом в конусе. Проверьте разные случаи: братьев и сестер, родителей, предков.Когда мы не в режиме конуса, мы можем только предполагать, что шаблоны должны быть добавлены в файл разреженной проверки.
А также:
sparse-checkout
: работать с путями WindowsПодписано: Деррик Столи
При использовании Windows пользователь может запустить '
git sparse-checkout
set A\B\C' to add the Unix-style path
A / B / C` к их схемам разреженного оформления заказа.Нормализация входного пути преобразует обратную косую черту в косую черту перед добавлением строки '
A/B/C
'в рекурсивный хеш-набор.
В шаблонах разреженной проверки долгое время было запрещено исключать все пути и оставлять пустое рабочее дерево.
В Git 2.27 (второй квартал 2020 г.) это ограничение снято.
См. Коммит ace224a (4 мая 2020 г.) Деррика Столи (derrickstolee
).
(Слияние Junio C Hamano -gitster
- в коммите e9acbd6, 08 мая 2020 г.)
sparse-checkout
: перестать блокировать пустые рабочие каталогиДокладчик: Ларс Шнайдер.
Подпись: Деррик Столи.Удалите условие ошибки, когда при обновлении разреженной проверки остается пустой рабочий каталог.
Это поведение было добавлено в 9e1afb167 ("разреженная проверка: запретить пустое рабочее дерево", 20.08.2009, Git v1.7.0-rc0 - слияние).
Комментарий был добавлен в a7bc906f2 ("Добавить объяснение, почему мы не разрешаем разреженную проверку пустого рабочего дерева", 2011-09-22, Git v1.7.8-rc0 - merge) в ответ на "сомнительный" комментарий в 84563a624 ("
[
распаковать-tree.c](https
://github.com/git/git/blob/ace224ac5fb120e9cae894e31713ab60e91f141f/unpack-trees.c): косметическое исправление ", 2010-12-22, Git v1.7.5-rc0 - слияние).С недавним "режимом конуса" и "
git sparse-checkout init [--cone]
", обычно задается разумный набор шаблонов разреженной проверки/* !/*/
который соответствует только файлам в корневом каталоге. Если в репозитории таких файлов нет, то их "
git sparse-checkout init
"команда завершится ошибкой.Теперь, когда мы ожидаем, что это будет общий шаблон, у нас не должно быть сбоев команд в пустом рабочем каталоге.
Если результат непонятен, пользователь может восстановить его с помощью "git sparse-checkout disable
" или "git sparse-checkout set
". Это особенно просто при использовании конусного режима.
С Git 2.37 (выпущенным в июне 2022 года) все намного проще. Чтобы исключить одну папку и несколько файлов, соответствующих маске (просто чтобы предоставить более общий/полезный пример, чем задает вопрос), я сделал это:
git sparse-checkout set --no-cone "/*" "!/folder/" "!/path/to/dist/*.map"
Это работало довольно интуитивно (ну, после нескольких часов, потраченных на поиск этой формулы). folder
полностью исчезает, все*.map
файлы изpath/to/dist
папка тоже. Больше ничего не трогали.
Несколько важных моментов:
Я настоятельно рекомендую сделать резервную копию вашего локального репо перед запуском, если в нем есть какие-либо неустановленные / игнорируемые файлы. Моя первая попытка (без "/*" и т. д.) была страшной - как будто большая часть моих данных исчезла. # 5 ниже, казалось, помог восстановить все, но вы никогда не знаете наверняка с большим репозиторием...
"/*"
был волшебный кусок. Он просит GIT включить все, что не будет исключено позже. Без него не работает (удаление большого количества содержимого репо). Он должен быть первым в списке!Вам может понадобиться
set +H
чтобы команда прошла (bash лечит!
как специальная команда). Иset -H
впоследствии, чтобы восстановить поведение bash по умолчанию.Я рекомендую проверить, как GIT интерпретирует пути, которые вы использовали, набрав:
cat .git/info/sparse-checkout
Прежде чем найти «формулу» для моего случая, я несколько раз удивлялся результатам (например, см. № 6).
Делать
ls
для нескольких путей репо после запуска команды. Если что-то пойдет не так, тоgit sparse-checkout disable
должен восстановить все недостающие файлы. По крайней мере, в моем случае это сработало очень хорошо.Лучше используйте кавычки для всех ваших путей. Особенно важно в "/*" ! Вот что я получил в .git/info/sparse-checkout, когда использовал его без кавычек (каждая с новой строки, по какой-то причине stackoverflow не очень хорошо форматирует):
/bin /dev /etc /home /lib /lib64 /opt /proc /root /run /sbin /tmp /usr /var !folder/ !path/to/dist/*.map
Вы можете себе представить, что эти шаблоны были не тем, что я хотел сказать...
Ум ведет косые черты везде(
"!/folder/"
). Если опустить ("!folder/"
) то папки с таким названием будут удаляться везде в иерархии, а не только на верхнем уровне.--no-cone
сейчас важно. В прошлом это был режим по умолчанию, и это может привести к путанице при просмотре старых советов в Интернете! Документы GIT уточняют это, если вы хотите лучше понять вещи.
Надеюсь, это поможет кому-то.
Обновление: добавлены начальные косые черты к исключенным путям, как описано в № 7 выше.
У меня такая же проблема. Я исправил это примерно так:
!presentations/heavy_presentation
presentations/*
Насколько я понимаю, что это работает: он читает файл правило по правилу. Если что-то включено, оно включает в себя все пути, которые содержат это слово, и больше не меняет свой статус до конца разреженной проверки. Если вы добавите исключающее правило перед включением, по моему мнению, он сначала удалит файлы, а затем пометит все как включенное.
Я не совсем уверен, это то, что я предположил, основываясь на своем опыте и работал на меня. Надеюсь, это кому-нибудь поможет.
Краткий ответ:
git sparse-checkout set /* !/presentations/heavy_presentation/
git sparse-checkout init [--cone]
--cone
Вариант: не актуально только для нескольких паттернов / небольшого репо, но для ускорения в целом. Требуется определенный канонический порядок шаблонов, как объясняется в
<tcode id="1572477"></tcode> /
<tcode id="1572478"></tcode>документация). Может быть представлен позже также:
git config core.sparseCheckoutCone true