Git 2.51

good-penguin.png

18 августа, после двух месяцев разработки, состоялся выпуск 2.51 распределённой системы управления исходными текстами Git.

По сравнению с прошлым выпуском в новую версию принято 506 изменений, подготовленных при участии 91 разработчика (21 впервые приняли участие в разработке Git).

Основные новшества:

  • Повышена производительность команд git push и git fetch в репозиториях с большим числом ссылок. Ускорение обеспечено за счёт обновления ссылок в пакетном режиме, в котором в одной транзакции обрабатывается сразу несколько ссылок, вместо создания отдельной транзакции для обновления каждой ссылки. Оптимизация существенно увеличила скорость работы бэкенда reftable, которые теперь обгоняет по производительности бэкенд files Например, в тестовом репозитории с 10 тысячами ссылок производительность git fetch при использовании бэкенда reftable увеличилась в 22 раза, а при использовании бэкенда files — в 1.25 раза. Для git push прирост составил 18 и 1.21 раза, соответственно.
  • Предложен новый метод упаковки в pack-файлах частей репозитория, не связанных с отслеживанием недостижимых объектов, на которые в репозитории отсутствуют ссылки (не ссылаются ветки или теги). Информация о недостижимых объектах хранится в отдельных pack-файлах («cruft packs»), что приводило к необходимости их отражения в многопакетных индексах MIDX («multi-pack index») для охвата объектов, которые изначально были недостижимы и хранились только в cruft-пакете, но затем стали достижимы после ссылающегося на них коммита.
    В новой версии при переупаковке pack-файлов обеспечено сохранение дополнительных копий достижимых объектов, хранимых только во cruft-файлах. Подобное изменение гарантирует, что в наборе pack-файлов, используемых для хранения достижимых объектов, не содержится объектов, ссылающихся на другие объекты, хранимые вне этого набора. Для исключения из многопакетных индексов (MIDX) недостижимого содержимого cruft-файлов предложена настройка repack.MIDXMustContainCruft, позволяющая заметно сократить размер подобных индексов. Включение настройки в репозитории GitHub позволило сократить размер MIDX-индексов на 38%, ускорить запись в MIDX-индексы на 35% и повысить производительность чтения на 5%.
  • В команду git pack-objects добавлена опция --path-walk, включающая новый метод сбора информации об объектах при переупаковке pack-файлов. Вместо обхода объектов в порядке ревизий, при использовании режима --path-walk объекты перебираются через обход файловых путей, что позволяет разом упаковывать все объекты с одним и тем же файловым путём. Подобный подход даёт возможность исключить эвристику, использующую хеширование для определения связи объекта с его файловым путём, а также избавиться от сортировки объектов перед упаковкой. При использовании режима --path-walk размер генерируемых pack-файлов получается значительно меньше, чем при группировке объектов при помощи хешей.
  • Определён формат для обмена сохранёнными состояниями рабочего дерева и индексов в репозитории, создаваемыми при помощи команды git stash. Новый формат позволяет кодировать сохранённые изменения (stash-записи) в виде последовательности коммитов. Для импорта и экспорта предложены подкоманды git stash import и git stash export, которые можно использовать для переноса сохранённых состояний с одной системы на другую и выполнения операций push или pull с этими состояниями как с обычными ветками или тегами.
  • В команде git cat-file, выводящей содержимое заданных объектов, при использовании опций --batch и --batch-check реализована возможность отображения информации об отсутствующих объектах (например, из-за повреждения репозитория) и субмодулях. Ранее при указании пути у субмодулю команда git cat-file --batch-check выводила «missing», а теперь покажет идентификатор объекта.
  • В команде git log задействованы оптимизации на основе фильтров Блума для ускорения поиска в истории изменений при указании фильтров с несколькими файловыми путями, например, git log -- path/to/a path/to/b.
  • Стабилизированы команды git switch и git restore, которые с 2019 года рассматривались как экспериментальные. Команды преподносятся как современные эквиваленты git checkout, разделяющие такие малосвязанные возможности данной команды, как манипуляция ветками (переключение и создание) и восстановление файлов в рабочем каталоге.
  • Объявлена устаревшей и намечена к удалению в ветке Git 3.0 команда git whatchanged, эквивалентная git log --raw.
  • В команду git for-each-ref добавлена опция --start-after, которая может применяться совместно с опцией --count для организации постраничного вывода.
  • В команды git merge и git pull добавлена опция --compact-summary для использования компактного формата сводной информации об изменениях вместо формата diffstat.
  • В кодовой базе Git разрешено использование ключевого слова bool, появившегося в стандарте C99. Также документированы некоторые возможности C99, экспериментально используемые в Git (например, в середине 2026 года планируют разрешить применение конструкций (struct foo){ .member = value };). Компилятор с поддержкой C99 является обязательным для Git c 2021 года, но возможности спецификации C99 внедряются крайне осторожно для сохранения совместимости с компиляторами, лишь частично поддерживающими данный стандарт.
  • В правила приёма патчей внесены изменения, разрешающие отправку патчей под псевдонимом, а не только под настоящим именем разработчика. Изменение соответствует правилам приёма патчей в ядро Linux.
  • Обновлён список нарушающих совместимость изменений, которые будут применены в ветке Git 3.0. Из значительных изменений в предстоящем выпуске Git 3.0 отмечается переход по умолчанию на идентификаторы объектов на основе алгоритма хеширования SHA-256 при инициализации новых репозиториев и задействование формата reftable для хранения в репозитории ссылок на ветки и теги (задействовано блочное хранилище от проекта JGit, оптимизированное для хранения очень большого числа ссылок).

>>> Подробности на opennet

©  Linux.org.ru