Включите исполнение JavaScript в браузере, чтобы запустить приложение.

OpenNET

Open source19 августа, 2025

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