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 включен.

Допустимые шаблоны в наборе шаблонов конусов:

  1. Рекурсивный: включены все пути внутри каталога.
  2. Родитель: включаются все файлы, находящиеся непосредственно в каталоге.

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

По умолчанию при запуске 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 pathA / 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папка тоже. Больше ничего не трогали.

Несколько важных моментов:

  1. Я настоятельно рекомендую сделать резервную копию вашего локального репо перед запуском, если в нем есть какие-либо неустановленные / игнорируемые файлы. Моя первая попытка (без "/*" и т. д.) была страшной - как будто большая часть моих данных исчезла. # 5 ниже, казалось, помог восстановить все, но вы никогда не знаете наверняка с большим репозиторием...

  2. "/*"был волшебный кусок. Он просит GIT включить все, что не будет исключено позже. Без него не работает (удаление большого количества содержимого репо). Он должен быть первым в списке!

  3. Вам может понадобитьсяset +Hчтобы команда прошла (bash лечит!как специальная команда). Иset -Hвпоследствии, чтобы восстановить поведение bash по умолчанию.

  4. Я рекомендую проверить, как GIT интерпретирует пути, которые вы использовали, набрав:

    cat .git/info/sparse-checkout

    Прежде чем найти «формулу» для моего случая, я несколько раз удивлялся результатам (например, см. № 6).

  5. Делатьlsдля нескольких путей репо после запуска команды. Если что-то пойдет не так, тоgit sparse-checkout disableдолжен восстановить все недостающие файлы. По крайней мере, в моем случае это сработало очень хорошо.

  6. Лучше используйте кавычки для всех ваших путей. Особенно важно в "/*" ! Вот что я получил в .git/info/sparse-checkout, когда использовал его без кавычек (каждая с новой строки, по какой-то причине stackoverflow не очень хорошо форматирует):

    /bin /dev /etc /home /lib /lib64 /opt /proc /root /run /sbin /tmp /usr /var !folder/ !path/to/dist/*.map

    Вы можете себе представить, что эти шаблоны были не тем, что я хотел сказать...

  7. Ум ведет косые черты везде("!/folder/"). Если опустить ("!folder/") то папки с таким названием будут удаляться везде в иерархии, а не только на верхнем уровне.

  8. --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
Другие вопросы по тегам