Доступна система управления исходными текстами Git 2.42

После двух с половиной месяцев разработки опубликован выпуск распределенной системы управления исходными текстами Git 2.42. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям “задним числом” используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.

По сравнению с прошлым выпуском в новую версию принято 453 изменения, подготовленные при участии 78 разработчиков, из которых 17 впервые приняли участие в разработке. Основные новшества:

  • Предложен новый алгоритм обхода битовых карт (дисковая структура “reachability bitmaps”), отражающих данные о наборах объектов, доступных для каждого коммита, и позволяющих быстро определить наличие базового объекта для сокращения времени извлечения данных при выполнении таких операций, как “git fetch”, “git rev-list” и “git clone” с большими репозиториями. Новый алгоритм обеспечивает заметный прирост производительности в условиях, когда битовая карта полностью не покрывает одну из сравниваемых веток. В некоторых ситуациях применение нового алгоритма может привести к ускорению в 2-15 раз. Для переключения на новый алгоритм следует выставить параметр pack.useBitmapBoundaryTraversal и перепаковать индексы, после чего использовать опцию “–use-bitmap-index” при выполнении “git rev-list”: git repack -ad –write-bitmap-index git config pack.useBitmapBoundaryTraversal true git rev-list –count –objects –tags –not –branches –use-bitmap-index
  • В команде “git for-each-ref” реализован гибкий механизм исключения ссылок из вывода, более удобный и эффективный, чем применение переменной “transfer.hideRefs”. Вместо поштучной проверки исключаемых ссылок, новый метод определяет начало и конец каждого исключаемого диапазона, и пропускает их в процессе разбора файла packed-refs. Шаблон для исключения задаётся при помощи новой опции “–exclude”. Дополнительно добавлена опция “–include”, которая позволяет вернуть отдельные части из исключаемого диапазона. Новый механизм также задействован для формирования списка заявленных для передачи ссылок во время выполнения операции push, при этом в тестах, охватывающих большие списки исключений, применение нового алгоритма позволяло до 20 раз снизить нагрузку на CPU.
  • Добавлен новый механизм для сохранения недостижимых объектов (unreachable object), на которые в репозитории отсутствуют ссылки (не ссылаются ветки или теги) и которые подлежат удалению сборщиком мусора после истечения таймаута. Для сохранения недостижимых объектов добавлен параметр gc.recentObjectsHook (“git config gc.recentObjectsHook /path/to/your/program”), позволяющий настроить вызов внешней программы перед началом сборки мусора (“git gc –prune=”). Указанная в параметре gc.recentObjectsHook программа возвращает список идентификаторов объектов, которые будут защищены от удаления сборщиком мусора, независимо от времени их нахождения в репозитории.
  • Расширено применение механизма частичных индексов (sparse index), охватывающих лишь часть репозитория. Частичные индексы позволяют повысить производительность и сэкономить место в репозиториях, в которых выполняются операции частичного клонирования (sparse-checkout) или осуществляется работа с неполной копией репозитория. В новом выпуске на использование частичных индексов переведена команда diff-tree.
  • В команде for-each-ref расширены средства форматирования ссылок при помощи опции “–format”. Появилась возможность вывода информации, связанной с GPG-подписями, например можно отдельно отобразить ключ, слепок ключа и имя разработчика, сформировавшего цифровую подпись. $ git for-each-ref –format=’%(refname) %(signature:key)’ –sort=v:refname ‘refs/remotes/origin/release-*’ | tac refs/remotes/origin/release-3.1 4AEE18F83AFDEB23 refs/remotes/origin/release-3.0 4AEE18F83AFDEB23 refs/remotes/origin/release-2.13 4AEE18F83AFDEB23
  • В команде “git rev-list” при использовании опции “–stdin” для упрощения вызова из скриптов разрешено указание через входной поток данных для расширенных модификаторов, таких как “–branches”, “–tags” и “–remotes”, а не только модификаторов, что ссылаются на коммиты по идентификатору объекта.
  • Реализовано отложенное удаление сообщения $GIT_DIR/TAG_EDITMSG, производимое только после успешной записи тега, что решает проблему удаления примечания до вывода сообщения об ошибке.
  • В команду “git worktree add” добавлена опция “–orphan” для создания рабочего дерева на основе осиротевшей ветки.
  • В команду “git cat-file” добавлен режим “-Z”, который в отличие от режима “-z” применяет разделение на основе символов с нулевым кодом (вместо символов перевода строки) не только для входных, но и для выходных данных.
  • В команду “git notes append” добавлена опция ‘–separator’ для выбора разделителя абзацев.
  • В команде “git diff –no-index” реализована возможность чтения из именованных каналов (“git diff
Release. Ссылка here.