Выпуск системы управления исходными текстами Git 2.48

Опубликован выпуск распределенной системы управления исходными текстами Git 2.48. Git отличается высокой производительностью и предоставляет средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям “задним числом” используются неявное хеширование всей предыдущей истории в каждом коммите, а также удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Код Git распространяется под лицензией GPLv2+.

По сравнению с прошлым выпуском в новую версию принято 605 изменений, подготовленных при участии 93 разработчиков, из которых 35 впервые участвуют в разработке. Основные новшества:

  • Реализована возможность сборки с использованием сборочной системы Meson, в дополнение к GNU Make и CMake. Для сборки Git теперь можно использовать команду “meson setup build && ninja -C build”. Отмечается, что Makefile, применяемый при использовании GNU Make, разросся до 3887 строк и не так прост, как хотелось бы. Инструментарий Meson упрощает работу с системой сборки, удобен для кросс-платформенных сборок и делает сборку более доступной для новичков или разработчиков, не имеющих опыта работы с утилитой Make. Прекращать поддержку Make и CMake в обозримом будущем не планируется.
  • Добавлены сборочные опции, позволяющие использовать альтернативные реализации хэша SHA-1 при вычислении контрольных сумм, используемых для проверки целостности блоков данных в pack-файлах. Производительность вычисления контрольных сумм имеет большое значение, например, на их вычисление при клонировании репозитория с ядром Linux тратится около 78% процессорного времени. Используемая по умолчанию реализация включает дополнительные проверки коллизий и защиту от атак на SHA-1, таких как SHAttered и Shambles. Подобная защита, потребляющая дополнительные ресурсы, имеет смысл только при использовании SHA-1 в криптографических целях и бесполезна при проверке целостности индексных данных.

    Для сборки Git с более быстрой реализацией SHA-1, не пригодной для криптосистем, предложена серия опций *_UNSAFE, например, “OPENSSL_SHA1_UNSAFE”. В GitHub сборка с упрощённым SHA-1 позволяет на 10-13% повысить производительность операций извлечения и клонирования данных.

  • Добавлена возможность использования в команде “range-diff” опции “–remerge-diff”, позволяющей показать отличия между общим результатом слияния и фактическими данными, отражёнными в коммите после обработки команды “merge”. При использовании опции “–remerge-diff” различия между разрешениями конфликтов не разделяются для каждой родительской ветки, а показываются общие различия между файлом, имеющим конфликты слияния, и файлом, в котором конфликты решены. В контексте команды “range-diff” новая опция может оказаться полезной для сравнения наборов коммитов после переноса последовательности коммитов командой “rebase” с опцией “–rebase-merges”.
  • Добавлена возможность запуска тестового набора Git с включением режима выявления утечек памяти. Так как git предоставляет утилиты, завершающие работу после выполнения вызванной функции, утечки памяти раньше не рассматривались как большая проблема. Необходимость полного устранения утечек памяти стала актуальной после начала работы над выносом внутренней функциональности в отдельную библиотеку, которая может применяться в длительно работающих процессах.
  • Началось формирование списка устаревших режимов и возможностей, поддержку которых планируют прекратить в будущем. Предполагается, что удаление устаревшей функциональности произойдёт в выпуске Git 3.0, в который войдут изменения, нарушающие обратную совместимость.
  • Продолжена оптимизация работы команды “git for-each-ref”, выводящей список ссылок в репозитории. Ранее добавленное улучшение, объединяющее обработчики для фильтрации ссылок и форматирования вывода, теперь применяется не только для неотсортированного вывода, но и при указании
    опции “–sort”.
  • Улучшена реализация бэкенда “reftable”, предоставляющего блочное хранилище для эффективного хранения в репозитории ссылок на ветки и теги, позволяющее значительно ускорить поиск, чтение и запись в репозиториях с очень большим числом ссылок. В новой версии прекращено обращение к некоторым вспомогательным API для дальнейшего исключения библиотеки libgit из числа сборочных зависимостей. Реализована адаптивная обработка ошибок, возвращаемых функциями выделения памяти (нехватка памяти теперь не приводит к аварийному завершению работы).
    Ускорены операции создания ссылок и снижено потребление памяти.
  • В реализации частичного клонирования решены проблемы, приводившие к зацикливанию и повреждению репозитория после выполнения команды “git gc”.
  • При выполнении команды “git fetch ” в случае отсутствия на локальной системе “refs/remotes//HEAD” и наличия на другой стороне ветки, на которую ссылается HEAD, “refs/remotes//HEAD” перенаправляется на эту ветку. Для управления синхронизацией “refs/remotes//HEAD” со значением HEAD на другой стороне соединения добавлена настройка remote..followRemoteHEAD”.
  • Добавлена настройка “remote..serverOption” аналогичная опции командной строки “–serverOption=”.
  • В команде “git rebase –rebase-merges” по возможности обеспечено использование имён веток в качестве меток.
  • В команды ‘git notes add’ и ‘git notes append’ добавлен флаг ‘-e’, открывающий заметку во внешнем текстовом редакторе, указанном через переменную окружения GIT_EDITOR.
  • Улучшена совместимость с GCC 15 и стандартом C23.
  • Прекращена поддержка старых версий libcURL и Perl.
Release. Ссылка here.