Вышел Git 2.34: что нового

Распределенная система управления версиями Git обновилась до версии 2.34. Обновление состоит из исправлений, которые предложилили более сотни участников сообщества. Новая версия включает в себя как исправление багов из прошлых версий, так и добавление новых функций.

534e3ffdda525197ca11e5f20ed2d9cc.jpg

В прошлом обновлении разработчики добавили возможность клонировать себе только ту часть репозитория, которая нужна для работы. Это значительно упрощает работу над большими проектами. Несмотря на это, функция работала неточно. Все из-за индекса в котором Git хранит изменения всего репозитория и выгружает их при вызове git commit. Даже если пользователь работает исключительно с одной папкой проекта, индексу необходимо отслеживать состояние каждого файла в репозитории. В новой версии разработчики представили разреженный индекс. Новая структура данных может хранить в себе изменения конкретного места в проекте и не требует информации о всем репозитории.

По умолчанию Git использует рекурсивный алгоритм слияния, но в новой версии перешли на ort-алгоритм, который имитирует те же самые концепции, что и прошлый, но более производительно. В среднем скорость работы превосходит рекурсивный алгоритм в 500 раз. 

В версии Git 2.34 можно подписывать проекты с помощью SSH-ключа вместо PGP-ключа. Для этого необходимо установить user.signinKey на тот ключ, который планируется использовать. После этого подпись автоматически будет применяться при вызове git commit -S git merge-S git tag -S.

Теперь можно настроить Git таким образом, чтобы система интерактивно предлагала исправления ошибок. К примеру, в прошлой версии при вызове ошибочного git psuh вместо push, пользователь увидел бы такую ошибку:

$ git psuh
git: 'psuh' is not a git command. See 'git --help'.

The most similar command is
  push

и мог бы настроить перевыполнение предложенной команды с некоторой задержкой. Теперь же система спросит стоит ли это делать. Для активации режима достаточно установить help.autoCorrect в значение promt.

Несмотря на то, что большая часть Git написана на C, подкоманды до настоящего момента были сценариями оболочки. Теперь же они тоже переписаны на C. Этот процесс завершил Атхарва Райкар (Atharva Raykar) студент Google Summer of Code.

Также в Git устранили некоторые утечки памяти. В патче сделали возможным запускать интеграционные тесты в режиме, который гарантирует отсутствие утечек с помощью настроек в среде IT_TEST_PASSING_SANITIZE_LEAK=true. Также добавили тесты, позволяющие обнаружить утечки после сборки Git. 

Для получения отладочной информации обычно используют механизм Trace2 и зачастую выдача бывает нетривиальной. К примеру, при запуске git fetch фактически запускается git fetch-pack, который затем вызывает git upload-pack, который, в свою очередь обращается к git pack-objects. И после этого в выдаче теряются необходимые данные. Теперь в вывод Trace2 добавили больше отладочной информации и упорядочили ее, чтобы точно указать полный путь происхождения вызванного процесса.

В предыдущих версиях опция --grep фильтровала только те результаты, которые были предоставлены на вход в git log. В версии 2.34 git log теперь сама знает как подсвечивать информацию на выходе.

Пример вывода git logПример вывода git log

Также исправили ошибку в терминале Windows при запуске git commit или git rebase. Причина ошибки была в том, что Git использует свой терминал вместе со всеми дочерними процессами, включая и процессы штатного редактора. В Git 2.34 предоставлена возможность сохранять и восстанавливать настройки терминала до и после запуска редактора.

Еще некоторые обновления в Git 2.34:

  • git bundle unbundle теперь отображает прогресс;

  • помощник кэширования учетных данных адаптирован для Windows;  

  • обновили таблицу ширины символов Unicode;

  • git fsck теперь сообщает о несоответствии между ожидаемым и актуальным типом объекта;

  • оптимизировали обработку большого количества ссылок в коде git fetch;

  • удалили функцию OPTION_ARGUMENT из parse-options API;

  • исправили ошибки в git rebase -r;

  • исправили синтаксический анализатор для опции --nl в git column.

© Habrahabr.ru