После двух месяцев разработки опубликован выпуск распределенной системы управления исходными текстами Git 2.35. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям “задним числом” используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.
По сравнению с прошлым выпуском в новую версию принято 494 изменения, подготовленные при участии 93 разработчиков, из которых 35 впервые приняли участие в разработке. Основные новшества:
- Расширены возможности по использованию SSH-ключей для заверения Git-объектов цифровой подписью. Для разграничения времени действия нескольких ключей добавлена поддержка OpenSSH-директив “valid-before” и “valid-after”, при помощи которых можно обеспечить корректную работу с подписями после ротации ключа одного из разработчиков. До этого, возникала проблема с разделением подписей старым и новым ключом – если удалить старый ключ, то невозможно будет проверить сделанные с его помощью подписи, а если оставить – то сохранится возможность создания новых подписей старым ключом, на смену которому уже пришёл другой ключ.
При помощи valid-before и valid-after можно разделить область действия ключей на основе времени создания подписи. - В настройке merge.conflictStyle, позволяющей выбрать режим оформления информации о конфликтах при слиянии, появилась поддержка режима “zdiff3”, перемещающего за пределы области конфликта все типовые строки, указанные в начале или конце конфликта, что позволяет добиться более компактного представления информации.
- В команду “git stash” добавлен режим “–staged”, который позволяет спрятать только изменения, добавленные в индекс, например в ситуации, когда необходимо временно отложить часть сложных изменений для того, чтобы вначале добавить то, что уже готово, а с остальным разобраться через какое-то время. Режим напоминает команду “git commit”, записывающую только помещённые в индекс изменения, но вместо создания нового коммита в “git stash –staged” результат сохраняется во временную область stash. После того, как изменения понадобятся их можно вернуть командой “git stash pop”.
- В команду “git log” добавлен новый спецификатор формата “–format=%(describe)”, позволяющий совместить вывод “git log” с результатом выполнения команды команды “git describe”. Параметры для “git describe” указываются непосредственно внутри спецификатора (“–format=%(describe:match=,exclude=)”), в котором также можно включить сокращённые теги (“–format=%(describe:tags=)”) и настроить число шестнадцатеричных символов для идентификации объектов (“–format=%(describe:abbrev=)”). Например, для вывода 8 последних коммитов, теги которых не имеют метки кандидата в релизы, и указания 8-символьных идентификаторов можно использовать команду: $ git log -8 –format=’%(describe:exclude=*-rc*,abbrev=13)’ v2.34.1-646-gaf4e5f569bc89 v2.34.1-644-g0330edb239c24 v2.33.1-641-g15f002812f858 v2.34.1-643-g2b95d94b056ab v2.34.1-642-gb56bd95bbc8f7 v2.34.1-203-gffb9f2980902d v2.34.1-640-gdf3c41adeb212 v2.34.1-639-g36b65715a4132
- В настройке user.signingKey реализована поддержка новых типов ключей, не ограничивающихся типом “ssh-” и указанием полного файлового пути к ключу. Альтернативные типы задаются при помощи префикса “key::”, например, “key::ecdsa-sha2-nistp256” для ключей ECDSA.
- Заметно повышена скорость генерации списка изменений в режиме “–histogram”, а также при использовании опции “–color-moved-ws”, управляющей подсвечиванием пробелов в цветном diff-е.
- В команде “git jump”, применяемой для предоставления Vim информации о точных переходах на искомую позицию в файле при разборе конфликтов слияния, просмотре различий или выполнении операции поиска, предоставлена возможность сужения охватываемых конфликтов слияния. Например, для ограничения операций только каталогом “foo” можно указать “git jump merge — foo”, а для исключения из обработки каталога “Documentation” – “git jump merge — ‘:^Documentation'”
- Проведена работа по стандартизации применения типа “size_t” вместо “used unsigned” для значений, представляющих размер объектов, что позволило добиться возможности применения фильтров “clean” и “smudge” с файлами размером более 4 ГБ на всех платформах, включая платформы с моделью данных LLP64, тип “used unsigned” в которой ограничен 4 байтами.
- В команду “git am” добавлена опция “–empty=(stop|drop|keep)”, позволяющая при разборе патчей из почтового ящика выбрать поведение для пустых писем, не содержащих патчей. Значение “stop” приведёт к завершению всей операции применения патчей, “drop” – пропустит пустой патч, “keep” – создаст пустой коммит.
- В команды “git reset”, “git diff”, “git blame”, “git fetch”, “git pull” и “git ls-files” добавлена поддержка частичных индексов (sparse index), позволяющих повысить производительность и сэкономить место в репозиториях, в которых выполняются операции частичного клонирования (sparse-checkout).
- Объявлена устаревшей команда “git sparse-checkout init”, вместо которой следует использовать “git sparse-checkout set”.
- Добавлена начальная реализация нового бэкенда “reftable” для хранения ссылок, таких как ветки и теги, в репозитории. Новый бэкенд использует блочное хранилище, применяемое проектом JGit и оптимизированное для хранения очень большого числа ссылок. Бэкенд пока не интегрирован с системой ссылок (refs) и не готов для практического применения.
- Цветовая палитра команды “git grep” приведена к соответствию утилите GNU grep.