Git 2.54

Представлен релиз распределенной системы управления исходными текстами Git 2.54. Git отличается высокой производительностью и предоставляет средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям «задним числом» используются неявное хеширование всей предыдущей истории в каждом коммите, а также удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Код Git распространяется под лицензией GPLv2+.
По сравнению с прошлым выпуском в новую версию принято 770 изменений, подготовленных при участии 137 разработчиков (66 впервые приняли участие в разработке Git).
Основные новшества:
-
Реализована команда «git history», предоставляющая экспериментальные возможности для перезаписи истории изменений, более простые и безопасные в использовании, чем перебазирование коммитов командой
git rebase. Предоставляются две операции:git history rewordдля перезаписи сообщения в указанном коммите без изменения рабочего дерева и индекса (кроме примечания, остальное остаётся нетронутым). Например, для исправления опечатки.git history splitдля интерактивного разделения указанного коммита на два разных коммита с перемещением выбранных частей из исходного коммита в дополнительный коммит.
В будущих выпусках ожидается добавление дополнительных команд:
git history fixupдля исправления коммита,git history dropдля удаления коммита,git history reorderдля изменения порядка следования коммитов иgit history squashдля объединения коммитов. -
Реализован новый метод определения обработчиков (hook) в файлах конфигурации. Вместо размещения скриптов с обработчиками в каталоге
.git/hooksв каждом репозитории, команды для вызова обработчиков теперь можно задавать непосредственно в файлах конфигурации. Настройки можно привязывать к репозиторию или указывать в файлах конфигурации, действующих для всех репозиториев (/etc/gitconfig) или репозиториев пользователя (~/.gitconfig). Возможна привязка нескольких обработчиков к одному событию. Скрипты из.git/hooksпо-прежнему продолжают вызываться, но запускаются после обработчиков из файлов кофигурации. Для просмотра списка обработчиков следует использовать командуgit hook list, а для выборочного отключения вызова обработчиков — настройкуhook..enabled = false:
[hook "linter"]
event = pre-commit
command = ~/bin/linter --cpp20
[hook "no-leaks"]
event = pre-commit
command = ~/bin/leak-detector
$ git hook list pre-commit
global linter ~/bin/linter --cpp20
local no-leaks ~/bin/leak-detector
- В команде «git maintenance» по умолчанию задействована стратегия
geometric(git config set maintenance.strategy geometric), позволяющая сократить время обслуживания крупных монорепозиториев. По сравнению с ранее применяемой стратегией, использующей логику как в командеgit gc, новая стратегия избегает переупаковки всех объектов и исключает излишне ресурсоёмкие операции, такие как слияние всех pack-файлов (по возможности объединение производится частями и без чистки удалённых объектов). - База данных объектов (ODB) и связанные с ней API переведены на новую архитектуру, основанную на использовании подключаемых бэкендов. Проведённая реструктуризация абстрагирует формат хранения объектов и в дальнейшем позволит реализовать такие возможности, как альтернативные бэкенды и форматы объектов, например, для более эффективного хранения крупных бинарных файлов или для оптимизации работы крупных git-хостингов.
- В команде «git repo structure», выводящей сведения о структуре репозитория, обеспечено отображение не только общего размера, но и показа самых крупных объектов каждого типа, что позволяет обойтись при оценке размера без использования сторонней утилиты git-sizer.
$ git repo structure
...
| * Largest objects | |
| * Commits | |
| * Maximum size [1] | 17.23 KiB |
| * Maximum parents [2] | 10 |
| * Trees | |
| * Maximum size [3] | 58.85 KiB |
| * Maximum entries [4] | 1.18 k |
| * Blobs | |
| * Maximum size [5] | 1019.51 KiB |
| * Tags | |
| * Maximum size [6] | 7.13 KiB |
- В команде «git replay», применяемой вместо
git rebaseдля воссоздания истории на сервере без рабочего дерева, включено по умолчанию атомарное обновление ссылок (вместо вывода списка командupdate-refдля ручного выполнения), реализована опция--revertдля отмены изменений от серии коммитов, обеспечено отбрасывание результирующих пустых коммитов и появилась возможность воссоздания истории вплоть до корневого коммита. - В «git rev-list» и похожие команды добавлена опция
--maximal-onlyдля показа только коммитов, недостижимых другими коммитами. - В команду «git repo info» добавлена опция
--keysдля вывода списка всех известных ключей. - В команде «git add -p» при навигации между блоками кода при помощи клавиш «J» и «K» обеспечена пометка уже одобренных и пропущенных блоков. Добавлена опция
--no-auto-advanceдля отключения автоматического перехода к следующему файлу, чтобы иметь возможность вернуться к прошлым файлам перед коммитом. - Проведена оптимизация web-интерфейса «gitweb» для работы с мобильных устройств.
- В команде «git apply –directory» перед использованием обеспечена нормализация файловых путей, таких как
./un/../normalized/path. - Документирована возможность добавления собственных подкоманд через размещение файлов
git-в каталоге с исполняемыми файлами. - В команду «git send-email» добавлена поддержка клиентских сертификатов.
- Для команды «git status» реализована настройка
status.compareBranches, через которую можно указать ветки, с которыми будет производиться сравнение текущей ветки:
[status]
compareBranches = @{upstream} @{push}
- В «git rebase» добавлена опция
--trailerдля упрощения добавления метаданных ко всем коммитам:
git rebase --trailer "Reviewed-by: Test "`
- В команду «git fast-import» добавлена возможность замены подписей для коммитов, которые стали невалидны после импорта.
- Добавлена поддержка упаковки (compaction) многопакетных индексов MIDX (multi-pack index), при которой между собой объединяются мелкие слои MIDX-индекса c информацией о доступности объектов и связанные с ними bitmap-файлы, что позволяет уменьшить число накопившихся слоёв в давно существующих репозиториях.
- В команде
git backfillреализована возможность указания ревизий (диапазонов коммитов) и масок путей (pathspec) для ограничения загружаемых частей истории изменений:
git backfill main~100..main
git backfill -- '\*.c'
- Добавлены альтернативные формы вызова команды
git config list—git config -lиgit config --list. - Разрешено использование не-ASCII символов в именах псевдонимов команд, задаваемых в файле конфигурации:
[alias "получить"]
command = fetch
- Изменено отображение подписей, у которых истёк срок действия GPG-ключей, но которые были валидны на момент подписания коммита. Подобные подписи теперь отображаются как корректные с примечанием об устаревании ключа (ранее они подсвечивались красным цветом, что создавало впечатление об их некорректности).
- При обращении к репозиториям по HTTP обеспечена обработка ошибки с кодом 429 (Too Many Requests). Завершившиеся подобной ошибкой запросы теперь рассматриваются не как фатальная проблема, а как временная ошибка, для которой через какое-время следует повторить операцию. Задержка перед повтором задаётся через опцию
http.retryAfter, число повторов —http.maxRetries, время ожидания —http.maxRetryTime.
>>> Источник: OpenNET
