Выпуск системы управления исходными текстами Git 2.54

Представлен релиз распределенной системы управления исходными текстами Git 2.54. Git отличается высокой производительностью и предоставляет средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям «задним числом» используются неявное хеширование всей предыдущей истории в каждом коммите, а также удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Код Git распространяется под лицензией GPLv2+.

По сравнению с прошлым выпуском в новую версию принято 770 изменений, подготовленных при участии 137 разработчиков (66 впервые приняли участие в разработке Git). Основные новшества:

  • Реализована команда «git history», предоставляющая экспериментальные возможности для перезаписи истории изменений, более простые и безопасные в использовании, чем перебазирование коммитов командой «git rebase». Предоставляются две операции:
    • «git history reword ‹commit›» для перезаписи сообщения в указанном коммите без изменения рабочего дерева и индекса (кроме примечания, остальное остаётся нетронутым). Например, для исправления опечатки.
    • «git history split ‹commit›» для интерактивного разделения указанного коммита на два разных коммита с перемещением выбранных частей из исходного коммита в дополнительный коммит.

    В будущих выпусках ожидается добавление дополнительных команд: «git history fixup» для исправления коммита, «git history drop» для удаления коммита, «git history reorder» для изменения порядка следования коммитов и «git history squash» для объединения коммитов.

  • Реализован новый метод определения обработчиков (hook) в файлах конфигурации. Вместо размещения скриптов с обработчиками в каталоге ».git/hooks» в каждом репозитории, команды для вызова обработчиков теперь можно задавать непосредственно в файлах конфигурации. Настройки можно привязывать к репозиторию или указывать в файлах конфигурации, действующих для всех репозиториев (/etc/gitconfig) или репозиториев пользователя (~/.gitconfig). Возможна привязка нескольких обработчиков к одному событию. Скрипты из ».git/hooks» по-прежнему продолжают вызываться, но запускаются после обработчиков из файлов кофигурации. Для просмотра списка обработчиков следует использовать команду «git hook list», а для выборочного отключения вызова обработчиков — настройку «hook.‹name›.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-‹cmd›» в каталоге с исполняемыми файлами.

  • В команду «git send-email» добавлена поддержка клиентских сертификатов.

  • Для команды «git status» реализована настройка «status.compareBranches», через которую можно указать ветки, с которыми будет производиться сравнение текущей ветки.
    [status]
       compareBranches = @{upstream} @{push}
    
  • В «git rebase» добавлена опция »--trailer» для упрощения добавления метаданных ко всем коммитам.
       git rebase --trailer "Reviewed-by: Test ‹test@example.com›"
    
  • В команду «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».



Источник: http://www.opennet.ru/opennews/art.shtml? num=65252

© OpenNet