Выпуск системы управления исходными текстами Git 2.51
После двух месяцев разработки представлен релиз распределенной системы управления исходными текстами Git 2.51. Git отличается высокой производительностью и предоставляет средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям «задним числом» используются неявное хеширование всей предыдущей истории в каждом коммите, а также удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Код Git распространяется под лицензией GPLv2+.
По сравнению с прошлым выпуском в новую версию принято 506 изменений, подготовленных при участии 91 разработчика (21 впервые приняли участие в разработке Git). Основные новшества (1, 2, 3):
Повышена производительность команд «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 stash export --to-ref refs/stashes/my-stash git push origin refs/stashes/my-stash ... git fetch origin '+refs/stashes/*:refs/stashes/*' git stash import refs/stashes/my-stash
В команде «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, оптимизированное для хранения очень большого числа ссылок).
Источник: http://www.opennet.ru/opennews/art.shtml? num=63742
© OpenNet
