След три месеца разработка, издадена версия на разпределената система за управление на изходния код Git 2.41. Git е една от най-популярните, надеждни и производителни системи за управление на версии, предоставяща гъвкави средства за нелинейно разработване, основани на разклоняване и сливане на клонове. За осигуряване на целостта на историята и устойчивост на изменения, направени „заден план“, се използва неявно хеширане на цялата предходна история във всяко комитване, също така е възможно удостоверяване чрез цифрови подписи на разработчиците за отделни тагове и комити.
Сравнено с предишната версия, в новата версия са включени 542 изменения, подготвени с участието на 95 разработчици, от които 29 за първи път участват в разработката. Основните нововъведения са:
- Подобрен е достъпът до недостижими обекти (unreachable), на които в репозитория няма линкове (не слагат скицата или таговете). Недостижимите обекти се изтриват от сборщика на отпадъци, но преди изтриването остават известно време в репозитория, за да се избегне състоянието на конкуренция. За проследяване на срока на съществуване на недостижимите обекти е необходима привръзка на тях с метки за времето на промяна на подобни обекти, което не позволява да се съхраняват в един pack-файл, в който всички обекти имат общо време на промяна. По-рано всеки недостижим обект се съхраняваше в отделен файл, което водеше до проблеми при наличието на голям брой нови недостижими обекти, които все още не подлежат на изтриване. В новата версия за опаковане на недостижимите обекти по подразбиране се използва механизма „cruft packs“, който позволява да се съхраняват всички недостижими обекти в един pack-файл, а данните за времето на модификация на всеки обект да се отразяват в отделна таблица, съхранявана в файл с разширение „.mtimes“ и свързана с индексен файл с разширение „.idx“.

- По подразбиране е включено поддържането на диск за обратен индекс (revindex) за pack-файлове. При тестване на репозитория torvalds/linux, прилагането на обратен индекс позволява да се ускорят ресурсно интензивните операции „git push“ с 1.49 пъти, а простите операции, като изчисляване размера на един обект с „git cat-file —batch=’%(objectsize:disk)'“, с 77 пъти. Файловете („.rev“) с обратен индекс ще бъдат запазени в рамките на репозитория в директорията „.git/objects/pack“.
Напомняме, че Git съхранява всички данни под формата на обекти, които се разполагат в отделни файлове. За повишаване на ефективността при работа с репозитория, обектите се поставят допълнително в pack-файлове, в които информацията е представена под формата на поток от обекти, следващи един след друг (аналогичен формат се използва при предаване на обекти с командите git fetch и git push). За всеки pack-файл се създава индексен файл (.idx), позволяващ по идентификатора на обекта много бързо да се определи отместването в pack-файла, в който се съхранява даденият обект.
Включеният в новото издание обратен индекс е насочен към оптимизиране на процеса на определяне на идентификатора на обекта по информация за разположението на обекта в pack-файла. По-рано това преобразуване се извършваше на лето по време на анализа на pack-файла и се съхраняваше само в паметта, което не позволяваше повторно използване на подобни индекси и принуждаваше към генериране на индекс всеки път. Операцията по изграждане на индекса се свежда до изграждане на масив от двойки „обект-позиция“ и неговото сортиране по позиция, което може да отнеме много време за големи pack-файлове.
Например, операцията по извеждане на съдържанието на обектите, в която се използва директен индекс, се извършваше 62 пъти по-бързо, отколкото операцията за показване на размера на обектите, за която данните за свързаност между позицията и обекта не бяха индексирани. След използването на обратен индекс, посочените операции започнаха да отнемат приблизително едно и също време. Обратните индекси също така позволяват ускоряване на операциите по изпращане на обекти при извършване на командите fetch и push чрез директна предаване на вече готови данни от диска.

- В протокола „credential helper“, който се прилага за предаване на данни за удостоверяване при достъп до репозитории с ограничен достъп, е добавена поддръжка за предаване на заглавките WWW-Authenticate между обработчика на данни за удостоверяване и услугата, в която се извършва аутентификацията. Поддръжката на заглавката WWW-Authenticate позволява предаване на параметри scope на OAuth за по-гранулирано разделение на достъпа на потребителя до репозиториите и разграничаване на областите, достъпни за запитвания.
- В командата for-each-ref е добавена опция за форматиране «%(ahead-behind:)», която позволява да получите информация за броя на комитите, налични или отсъстващи в определена клон, спрямо друг клон (колко една клон изостава или изпреварва друга на ниво комити). По-рано, за да получите такава информация, е трябвало да изпълните две отделни команди: «git rev-list —count main..my-feature» за получаване на броя уникални за клона комити и «git rev-list —count my-feature..main» за получаване на броя на отсъстващите комити. Сега подобни изчисления могат да бъдат сведени до една команда, което опростява написването на обработващи скриптове и намалява времето за изпълнение. Например, за показване на несъединените клонове и оценка на изоставането или изпреварването им спрямо основния клон, можете да използвате едноредов скрипт: $ git for-each-ref —no-merged=origin/HEAD \ —format='%(refname:short) %(ahead-behind:origin/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3 вместо предишно използвания скрипт, който се изпълнява 17 пъти по-бавно: $ git for-each-ref —format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead='$(git rev-list —count origin/HEAD..$ref)' behind='$(git rev-list —count $ref..origin/HEAD)' printf '%s %d %d ' '$ref' '$ahead' '$behind' done | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3
- В командата «git fetch» е добавена опция «—porcelain», която при задаване генерира изход в формат « », по-малко четим, но по-удобен за разбор в скриптове.
- Добавена е настройка «fetch.hideRefs», която позволява да се ускорят операциите «git fetch» чрез скриване на част от референтите в локалното хранилище на етапа на проверка, при която сървърът изпраща пълен комплект обекти, което спестява време, ограничавайки проверката само на сървъри, от които директно се извличат данни. Например, при провеждане на тест на система с хранилища, съдържащи голям брой наблюдавани външни референти, изключването на всичките референти, освен насочените към целевото сървъра $remote, позволява да се съкрати времето за изпълнение на операцията «git fetch» от 20 минути на 30 секунди. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- В командата «git fsck» е реализирана възможност за проверка на повреди, съответствие на контролни суми и коректност на стойностите в битовите карти на наличност и обратните индекси.
- В екипа "git clone --local" е реализирано извеждане на грешка при опит за копиране от репозитория, съдържащ символични връзки в $GIT_DIR.
Източник: opennet.ru


