Неглубокий И Разреженный GIT Репозиторий Клон
У меня мелкий клонированный репозиторий git, размер которого превышает 1 ГБ. Я использую редкие проверки для необходимых файлов / каталогов.
Как я могу уменьшить клон репозитория только до редких файлов / каталогов проверки?
Первоначально я мог ограничить клонированное хранилище только разреженной проверкой, отключив проверку при клонировании. Затем настройте разреженную проверку перед выполнением начальной проверки. Это ограничивало хранилище только до 200 МБ. Гораздо более управляемым. Однако обновление информации об удаленной ветке в будущем приведет к тому, что остальные файлы и каталоги будут включены в клон репозитория. Отправляя размер клона репо обратно более чем на 1 ГБ, и я не знаю, как просто разбросать файлы и каталоги.
Короче говоря, я хочу мелкий И редкий клон репозитория. Не просто редкая проверка мелкого репо-клона. Полное репо - это пустая трата пространства и производительность для определенных задач.
Надеюсь, что кто-то может поделиться решением. Благодарю.
2 ответа
Мелкий и разреженный означает "частичный" или "узкий".
Частичный клон (или "узкий клон") теоретически возможен и был впервые реализован в декабре 2017 года с помощью Git 2.16, как показано здесь.
Но:
- только с Git 2.18 вы можете сделать такое частичное клонирование: см. здесь тестовый пример.
- только с сервером, поддерживающим транспортный протокол V2 и Git 2.19: это обеспечит передачу только минимального объема данных.
Это дополнительно оптимизировано в Git 2.20 (Q4 2018), поскольку в частичном клоне, который будет лениво гидратироваться из исходного репозитория, мы обычно хотим избежать "существует ли этот объект (локально)?" на объектах, которые мы намеренно пропустили при создании (частичного / разреженного) клона.
Путь к коду дерева кеша (который используется для записи объекта дерева из индекса), однако настаивал на том, что объект существует даже для путей, которые находятся за пределами области частичной проверки.
Код был обновлен, чтобы избежать такой проверки.
Смотрите коммит 2f215ff (09 октября 2018 г.) Джонатана Тана ( jhowtan
)
(Объединено Юнио С Хамано - gitster
- в комитете a08b1d6, 19 октября 2018 г.)
cache-tree
: пропустить некоторые проверки BLOB-объектов в частичном клонированииВ частичном клонировании всякий раз, когда происходит разреженная проверка, проверяется существование всех больших двоичных объектов в индексе, независимо от того, включены они или исключены
.git/info/sparse-checkout
Спецификация.
Это значительно снижает производительность, потому что ленивая выборка происходит всякий раз, когда проверяется наличие отсутствующего большого двоичного объекта.
Короче говоря, мне нужен поверхностный И разреженный клон репозитория.
С Git 2.42 (3 квартал 2023 г.) это будет работать быстрее : "" (man ) научили пользоваться преимуществами функции разреженного индекса.
См. (18 мая 2023 г.) Шуци Ляна (
none
) .
(Объединено Джунио К. Хамано --
gitster
-- в коммите ca9c063 , 13 июня 2023 г.)
коммит 48c5fbf: интегрировать с разреженным индексом
При поддержке: Виктория Дай
Подпись: Шуци Лян
Индекс читается в '
cmd_diff_tree
' в двух точках:
Первое чтение индекса было добавлено в fd66bcc ("
diff-tree
: прочитать индекс, чтобы проверки атрибутов работали в пустых репозиториях", 2017-12-06, Git v2.16.0-rc0 — слияние , перечисленное в пакете № 10 ), чтобы справиться с чтением содержимого '.gitattributes'.
77efbb3 ("attr
: будьте осторожны с разреженными каталогами", 8 сентября 2021 г., Git v2.34.0-rc0 — слияние , перечисленное в пакете № 7 ), установило, что в разреженном индексе мы не пытаемся загрузить файл '.gitattributes' из в разреженном каталоге.Вторая точка доступа к индексу участвует в обнаружении переименования, особенно при чтении со стандартного ввода. Первоначально это было добавлено в («[PATCH] Оптимизировать дерево различий -[CM]--stdin», 27 мая 2005 г., Git v0. 99 — f0c6b2aслияние ), где для параметра «setup» установлено значение «
|DIFF_SETUP_USE_CACHE
'.
Позже это задание было изменено, чтобы исключитьDIFF_SETUP_USE_CACHE
' в ff7fe37 (": двигатьсяread_index()
код обратно вызывающему объекту", 13 августа 2018 г., Git v2.19.0-rc0 -- merge ).Однако, 'DIFF_SETUP_USE_SIZE_CACHE
' кажется, не используется с версии 6e0b8ed (: не использовать отдельный файл , 07.05.2007, Git v1.5.2-rc3 -- merge ) (diff.c
: не используйте отдельный "кеш размера"., 07.05.2007) и ничего про 'detect_rename
' в противном случае указывает на использование индекса.Следовательно, мы можем просто установить для параметра require-full-index значение false для «дерева различий».
The
p2000
тесты демонстрируют сокращение времени выполнения на ~98% для 'git diff-tree
' используя разреженный индекс:Test before after ----------------------------------------------------------------------- 2000.94: git diff-tree HEAD (full-v3) 0.05 0.04 -20.0% 2000.95: git diff-tree HEAD (full-v4) 0.06 0.05 -16.7% 2000.96: git diff-tree HEAD (sparse-v3) 0.59 0.01 -98.3% 2000.97: git diff-tree HEAD (sparse-v4) 0.61 0.01 -98.4% 2000.98: git diff-tree HEAD -- f2/f4/a (full-v3) 0.05 0.05 +0.0% 2000.99: git diff-tree HEAD -- f2/f4/a (full-v4) 0.05 0.04 -20.0% 2000.100: git diff-tree HEAD -- f2/f4/a (sparse-v3) 0.58 0.01 -98.3% 2000.101: git diff-tree HEAD -- f2/f4/a (sparse-v4) 0.55 0.01 -98.2%