Дата публикации:Tue, 19 Aug 2025 07:09:58 +0300
После двух месяцев разработки представлен релиз распределенной системы управления исходными текстами 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-файлов, используемых для хранения достижимых объектов, не содержится объектов, ссылающихся на другие объекты, хранимые вне этого набора. Для исключения недостижимого содержимого cruft-файлов из многопакетных индексов (MIDX) предложена настройка "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, оптимизированное для хранения очень большого числа ссылок).
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=63742