Выпуск Git 2.55 c включением по умолчанию поддержки Rust
Представлен релиз распределенной системы управления исходными текстами Git 2.55. Среди ключевых изменений: включение по умолчанию сборки с Rust, реализация для Linux процесса fsmonitor, новая стратегия переупаковки инкрементального MIDX-индекса, команда «git history fixup» для исправления коммита, оптимизация генерации битовых карт доступности объектов, поддержка параллельного выполнения hook-ов, команда «git format-rev». Код Git распространяется под лицензией GPLv2+.
По сравнению с прошлым выпуском в новую версию принято 505 изменений, подготовленных при участии 100 разработчиков, 33 из которых впервые приняли участие в разработке Git. Основные новшества (1, 2, 3):
По умолчанию включена поддержка компонентов на языке Rust. Компилятор rustc добавлен в число сборочных зависимостей. Для сборки без Rust можно использовать флаг «NO_RUST=1» при запуске утилиты make или »-Drust=disabled» при выполнении «meson configure». Возможность отключения сборки с Rust будет поддерживаться до ветки Git 3.0, в которой Rust будет включён в число обязательных зависимостей. На языке Rust реализована прослойка для переносимости между конфигурациями с хэшами SHA-1 и SHA-256, а также некоторые внутренние функции, такие как кодирование и декодирование целочисленных значений переменной длины. В будущем ожидается переработка на Rust более значительны внутренних компонентов Git.
В экспериментальную команду «git history», предоставляющую возможности для перезаписи истории изменений, добавлена операция «git history fixup» для исправления коммита. Операция «fixup» позволяет перенести изменения, добавленные через «git add», в более ранний коммит и автоматически переписать все последующие коммиты по аналогии с выполнением команды «git commit --fixup=‹commit›» и запуска «git rebase --autosquash ‹commit›~».
Для платформы Linux реализован фоновый процесс fsmonitor, отслеживающий изменения в файловой системе при помощи механизма inotify и позволяющий обойтись без перебора всего рабочего каталога при выполнении таких команд, как «git status» Включение осуществляется через настройку «core.fsmonitor».
В команду «git repack» добавлен режим »--write-midx=incremental», реализующий новую стратегию обновления метаданных в инкрементальном MIDX-индексе (multi-pack index), позволяющую обойтись без переупаковки всего индекса. В инкрементальном многопакетном индексе вместо одного большого индекса, содержащего информацию о распределении объектов по pack-файлам, применяется разделение на слои — каждый слой охватывает определённое число pack-файлов и хранится в отдельном bitmap-файле. Подобная структура позволяет добавлять в индекс данные об объектах в новых pack-файлах, прикрепляя к индексу новые слои без перестроения уже имеющихся слоёв.
Команда «git repack --write-midx=incremental» позволяет добавить в инкрементальный MIDX-индекс новый слой, охватывающий недавно созданные pack-файлы. В сочетании с режимом упаковки репозиториев »--geometric» новая команда даёт возможность объединить новые объекты из нескольких pack-файлов в один более крупный pack-файл и при необходимости осуществить упаковку и слияние нескольких соседних слоёв инкрементального MIDX-индекса. Подобная стратегия позволяет при выполнении «git repack» переписывать только верхние слои, оставляя старые большие слои нетронутыми, а также исключить неконтролируемое разрастание цепочки слоёв, поддерживая общее число слоёв на уровне, пропорциональном логарифму от общего числа объектов.
Значительно оптимизирована генерация битовых карт доступности объектов за счёт нового алгоритма обхода дерева объектов, исключающего лишнюю рекурсию, кэширования позиций объектов, сортировки битовых карт до их объединения операцией XOR и переработки кода для создания битовых карт псевдослияния (pseudo-merge). В тестовом репозитории оптимизации позволили сократить время генерации битовых карт с 612 до 294 секунд.
Реализована возможность параллельного выполнения независимых hook-ов в файлах конфигурации. Параллельно не могут запускаться hook-и, влияющие на совместное состояние или учитывающие его, например, меняющие примечания к коммитам или инспектирующие индексы и рабочее дерево. При этом можно параллельно запускать hook-и для проверки линтером и выполнения unit-тестирования. Допускающие параллельное выполнение hook-и настраиваются через параметр «hook.имя_хука.parallel = true». Число одновременно запускаемых работ определяется через настройку hook.jobs, hook.‹event›.jobs или опцию командной строки »-j».
В команде «git pack-objects --path-walk» реализована возможность указания фильтров, таких как «blob: none», «blob: limit=‹n›», «tree:0», «object: type=‹type›», «sparse: ‹oid›» и «combine:». В проведённом тесте отбрасывание блобов при выполнении »--path-walk» позволило на 16% сократить размер сформированного pack-файла.
- Добавлена команда «git format-rev» для форматирования ревизий и имён объектов, упоминаемых в списках коммитов или встречающихся в произвольном тексте (например, можно использовать в хукак для обработки примечаний к коммитам).
git last-modified | git format-rev --stdin-mode=text --format=%an Junio C Hamano builtin/commit.c
Включено по умолчанию экранирование большинства последовательностей управления терминалом в информационных сообщениях и тексте ошибок, передаваемых сервером. При обращении к вредоносному серверу подобные escape-последовательности могли использоваться для скрытия или модификации вывода, например, через escape-последовательности для перемещения курсора и очистки текста. Оставлена поддержка escape-последовательностей для выделения элементов цветом.
Команда «git checkout -m теперь автоматически сохраняет конфликтующие локальные изменения в stash-области без необходимости незамедлительно разрешать конфликт.
- В команду «git push» добавлена возможность помещения ветки на несколько внешних Git-серверов одной командой. Например, для передачи ветки main не только на основной сервер, но и на зеркала можно создать группу «publish» из серверов «github», «gitlab» и «mirror»:
git config remotes.publish "github gitlab mirror" git push publish main
- В команду «git log --graph» добавлена опция »--graph-lane-limit=‹N›» для ограничения числа вертикальных полос при визуализации веток, что позволяет оставить место на экране под данные о коммитах в репозиториях с большим числом веток.
... * | | | | 619931f561 Merge branch 'dl/posix-unused-warning-clang' |\ \ \ \ \ | * | | | ~ cf48887610 compat/posix.h: simplify GIT_GNUC_PREREQ() comparison | * | | | ~ ffd45926dc compat/posix.h: clean up GIT_GNUC_PREREQ() and UNUSED |\ \ \ \ \~ | * | | | ~ 3f5203eeb4 ls-files: filter pathspec before lstat
В команды «git log» и «git rev-list» добавлена опция »--max-count-oldest=‹N›, позволяющая выбрать N самых старых коммитов в диапазоне.
Источник: http://www.opennet.ru/opennews/art.shtml? num=65808
© OpenNet
