Достъпен е новият 2.31. на разпределената система за управление на изходни текстове Git. 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-only“ и „—right-only“ за показване само на едната страна от сравнявания диапазон.
- В командите „git diff“ и „git log“ са добавени опциите „—skip-to=“ и „—rotate-to=“ за пропускане или преместване до края на началните пътища.
- В командата „git difftool“ е добавена опция „—skip-to=“ за възобновяване на прекъснат сесия от произволен път.
- Кодексът на поведение (Code-of-conduct), определящ основните принципи за разрешаване на конфликти между разработчици, е актуализиран до версия 2.0 (предишно използваната версия беше 1.4).
Източник: opennet.ru
