Доступен выпуск распределенной системы управления исходными текстами Git 2.31. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям “задним числом” используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.
По сравнению с прошлым выпуском в новую версию принято 679 изменений, подготовленных при участии 85 разработчиков, из которых 23 впервые приняли участие в разработке. Основные новшества:
- Добавлена команда “git maintenance“, позволяющая выполнять периодические работы на системах не поддерживающих cron. Например, при помощи новой команды можно организовать периодический запуск процесса упаковки репозитория, чтобы не ждать завершения блокировки репозитория при автоматическом выполнении упаковки во время запуска различных команд. Команда “git maintenance” позволяет выполнять оптимизации и операции поддержания оптимальной структуры репозитория в фоновом режиме, не блокируя интерактивный сеанс – раз в час выполняется работа по упреждающей загрузке свежих объектов из удалённого репозитория и обновлению файла с графом коммитов, а каждую ночь запускается процесс упаковки репозитория.
- Добавлена поддержка ведения на диске обратного индекса (revindex) для pack-файлов. Напомним, что Git хранит все данные в форме объектов, которые размещаются в отдельных файлах. Для повышения эффективности работы с репозиторием объекты дополнительно помещаются в pack-файлы, в которых информация представлена в форме потока из объектов, следующих друг за другом (аналогичный формат используется при передаче объектов командами git fetch и git push). Для каждого pack-файла создаётся индексный файл (.idx), позволяющий по идентификатору объекта очень быстро определить смещение в pack-файле, по которому хранится данный объект. Предложенный в Git 2.31 обратный индекс (.rev) нацелен на оптимизацию процесса определения идентификатора объекта по информации о размещении объекта в pack-файле.
Ранее такое преобразование выполнялось на лету во время разбора pack-файла и хранилось только в памяти, что не позволяло повторно использовать подобные индексы и вынуждало генерировать индекс каждый раз. Операция построения индекса сводится к построению массива из пар “объект-позиция” и его сортировке по позиции, что может занимать много времени для больших pack-файлов.
Например, операция вывода содержимого объектов, в которой используется прямой индекс, выполнялась в 62 раза быстрее, чем операция показа размера объектов, для которой данные о связи позиции с объектом не индексировались. После использования обратного индекса указанные операции стали занимать примерно одинаковое время. Обратные индексы также позволяют ускорить операции отправки объектов при выполнении команд fetch и push за счёт прямой передачи уже готовых данных с диска. По умолчанию обратные индексы не создаются, для их генерации требуется включение настройки “git config pack.writeReverseIndex true” с последующей упаковкой репозитория командой “git repack -Ad”.
- Добавлены оптимизации производительности, основанные на появлении в файловом формате commit-graph, применяемом для оптимизации доступа к информации о коммитах, новых данных о номере генерации коммита, который может использоваться для ускорения многих операций обхода коммитов.
- Дополнены возможности по переопределению имени основной ветки, применяемой по умолчанию в новых репозиториях (настройка init.defaultBranch). При обращении к внешним репозиториям git пытается извлечь ветку, на которую указывает HEAD, т.е. если внешний сервер использует по умолчанию ветку “main”, то операция “git clone” попытается локально извлечь “main”. В Git 2.31 поддержка подобного извлечения теперь реализована и для пустых репозиториев. Например, при локальном клонировании нового репозитория перед добавлением в него первых патчей, локальная копия теперь будет содержать выставленное на внешнем сервере имя основной ветки по умолчанию.
- В команду “git rev-list” добавлена опция “–disk-usage”, позволяющая вывести сводные данные о размере объектов.
- В предвкушении грядущей замены бэкенда для выполнения слияний, значительно оптимизировано определение переименований.
- Прекращена поддержка устаревшей библиотеки регулярных выражений PCRE1.
- Предоставлена возможность принудительного запрета использования сокращённых ссылок независимо от алгоритма хэширования через присвоения значения “no” параметру core.abbrev.
- В “git rev-parse” добавлена опция “–path-format=(absolute|relative)” для явного определения вывода относительных или абсолютных путей.
- В скриптах для автодополнения ввода в Bash упрощено добавление правил дополнения для собственных подкоманд “git”.
- В “git bundle” добавлена опция “–stdin” для чтения ссылок из стандартного входного потока.
- В “git log” добавлена новая опция “–diff-merges=”
- В “git ls-files” добавлена опция “–deduplicatecan” для устранения дубликатов при выводе.
- Добавлены новые маски для исключения диапазона коммитов – “^!” и “^-“.
- В “git range-diff” добавлена опция “–(left|right)-only” для показа только одной стороны сравниваемого диапазона.
- В команды “git diff” и “git log” добавлены опции –skip-to=” и “–rotate-to=” для пропуска или перемещения в конец части путей.
- В “git difftool” добавлена опция “–skip-to=” для возобновления прерванного сеанса с произвольного пути.
- Кодекс поведения (Code-of-conduct), определяющий основные принципы разрешения конфликтных ситуаций между разработчиками, обновлён до версии 2.0 (ранее использовалась версия 1.4).