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, оптимизированное для хранения очень большого числа ссылок).