След три месеца разработка, представена е версия 2.52 на разпределената система за управление на изходните текстове Git. Git се характеризира с висока производителност и предлага средства за нелинейна разработка, базирани на разклоняване и сливане на клонове. За осигуряване на целостта на историята и устойчивостта на промени „зад колелото“ се използва неявно хеширане на цялата предишна история с всеки комит, както и удостоверяване с цифрови подписи на разработчиците за отделни тагове и комити. Кодът на Git се разпространява под лиценз GPLv2+.
В сравнение с предишното издание, в новата версия са приети 637 изменения, подготвени с участието на 94 разработчици (33 от които участват за първи път в разработката на Git). Основни нововъведения (1, 2, 3):
- Добавена е командата „git last-modified“, която показва списък с файлове в указаната ревизия и комити, през които са правени последните промени в всеки от тези файлове. $ git last-modified HEAD b56f6dcd7b4c90192018e848d0810f091d092913 test.h 29330ae4b820147c98e723399e9438c8bee60a8a test1.c 573ad8917beb99dc643b6e7f5c117a294384a575 test2.c
- Добавена е командата „git repo“ за извършване на действия, свързани с извличането на информация от репозитория. Предложени са две подкоманди — „git repo info“ и „git repo structure“, които извеждат информация за настройките на репозитория и данни за структурата на репозитория (например, можете да научите броя на връзките и обектите в репозитория). $ git repo info object.format references.format object.format=sha1 references.format=reftable $ git repo structure | Структура на репозитория | Стойност | | ——————— | —— | | * Връзки | | | * Брой | 1983 | | * Клони | 4 | | * Тагове | 1125 | | * Отдалечени | 854 | | * Други | 0 | | | | | * Достъпни обекти | | | * Брой | 518955 | | * Комити | 77469 | | * Дървета | 188865 | | * Блобове | 251631 | | * Тагове | 990 |
- В командата „git refs“ са добавени три подкоманди, които унифицират разпокъсаните и взаимодействащи ниско ниво операции с референции (git for-each-ref, git show-ref, git update-ref и git pack-refs):
- „git refs optimize“ — оптимизация на бекенда за съхранение на референции (по аналогия с „git pack-refs“).
- „git refs list“ — извежда списък на всички референции (по аналогия с „git for-each-ref“ или „git show-ref“).
- „git refs exists“ — проверка на съществуването на референция (аналог на „git show-ref —exists“).
- Форматът за експортиране или импортиране на историята на комитите е разширен с възможността за работа с криптографски подписи, използващи идентификатори на обекти, базирани на алгоритъра SHA-1 и на SHA-256. В командата „git fast-import“ е реализирана поддръжка за обработка на подписани тагове по аналогия с подписаните комити. Добавени са опции „—signed-commits=“ и „—signed-tags=“ за управление на обработката на подписани комити и тагове по време на импорта (режимът може да приема стойности verbatim, warn-verbatim, warn-stri, strip или abort).
- В командата „git maintenance“ е добавена поддръжка на новата стратегия „geometric“ („git config set maintenance.strategy geometric“), позволяваща да се намали времето за поддръжка на големи монорепозитории. В сравнение с предходната стратегия, използваща логиката в командата „git gc“, новата стратегия избягва повторната опаковка на всички обекти и изключва прекалено ресурсноемките операции, като обединяване на всички pack-файлове (по възможност обединението се извършва на части и без почистване на изтритите обекти).
- Добавена е командата „git sparse-checkout clean“, за да се улесни възстановяването на състоянието на работната директория, чрез премахване на файловете, които не отговарят на новото определение за sparse-checkout и не трябва да присъстват в локалната копия в съответствие с текущите параметри на sparse-checkout.
- С цел опростяване на кодовата база и улесняване на поддръжката е проведен рефакторинг, за да се намали използването на глобалната променлива the_repository.
- Разширено е приложението на Блум филтри, вероятностна структура за проверка на принадлежността към множество, допускаща погрешно определяне на отсъстващ елемент, но изключваща пропускането на съществуващ елемент. Блум филтрите сега се прилагат за ускоряване на търсенето в историята на промените при указване на маски в файловите пътища, например „foo/bar/*/baz“.
- Производителността на командата „git describe“ е увеличена с до 30%, благодарение на използването на опашки с приоритет. В „git remote rename“ са ускорени операциите по преименуване на референции. В „git ls-files“ е разширено приложението на индексите. Значително е ускорена работата на командата „git log -L“, благодарение на изключването на излишни тройни сравнения при обработката на сливането на комити. Внесени са оптимизации в библиотеката xdiff.
- Предоставена опционална възможност за използване на реализации на езика Rust на някои вътрешни функции, като кодиране и декодиране на целочислени стойности с променлива дължина. По подразбиране кодът на Rust не се използва и за активирането му е необходимо да се зададе флагът за изграждане WITH_RUST. В бъдеще се очаква преработване на по-съществени вътрешни компоненти на Git на Rust и добавяне на Rust в списъка с задължителни зависимости при сборка в Git 3.0.
- Актуализиран е списъкът на несъвместимите промени, които ще бъдат приложени в клон Git 3.0. В Git 3.0 е решено настройката init.defaultBranch по подразбиране да бъде променена на „main“, т.е. в репозиториите, създадени с командата „git init“, клонът по подразбиране ще се нарича „main“, а не „master“. Също така се отбелязва преходът по подразбиране към идентификатори на обекти, базирани на алгоритъма за хеширане SHA-256, при инициализация на нови репозитории. За облекчаване на преносимостта между репозитории с идентификатори на обекти на базата на SHA-1 и SHA-256 е предоставена възможност в репозиторийните с един алгоритъм за хеширане да се извършват операции push и pull от репозитория, използващ друг алгоритъм за хеширане.
Източник: opennet.ru
