Po treh mesecih razvoja je izšla nova verzija porazdeljenega sistema za upravljanje izvornih besedil Git 2.41. Git je eden najbolj priljubljenih, zanesljivih in zmogljivih sistemov za upravljanje različic, ki ponuja prilagodljive načine nelinearnega razvoja, temelječega na razvejanju in združevanju vej. Za zagotavljanje celovitosti zgodovine in odpornosti na spremembe 'nazaj v času' se uporablja implicitno hashiranje celotne prejšnje zgodovine v vsakem commitu, prav tako je možna overitev z digitalnimi podpisi nad posameznimi oznakami in commit-i.
V primerjavi s prejšnjo različico je nova različica sprejela 542 sprememb, ki so jih pripravili 95 razvijalcev, od katerih je 29 prvič sodelovalo pri razvoju. Glavne novosti:
- Izboljšano je obvladovanje nedosegljivih objektov (unreachable), na katere v repozitoriju ni sklicevanja (veje ali oznake). Nedosegljivi objekti se odstranijo s pomočjo zbiralnika smeti, vendar ostanejo v repozitoriju določen čas pred brisanjem, da se izognejo stanjem dirke. Za sledenje obdobju prisotnosti nedosegljivih objektov je potrebno vezati etikete s časom spremembe teh objektov, kar ne dovoljuje shranjevanja v istem pack-datoteki, kjer imajo vsi objekti skupen čas spremembe. Prej je bil vsak nedosegljiv objekt shranjen v ločeni datoteki, kar je povzročalo težave ob prisotnosti velikega števila nedosegljivih objektov, ki še niso bili podvrženi brisanju. V novi različici je za pakiranje nedosegljivih objektov po privzetku uporabljen mehanizem 'cruft packs', ki omogoča shranjevanje vseh nedosegljivih objektov v eni pack-datoteki, podatke o času spremembe vsakega objekta pa odraža ločena tabela, ki se shranjuje v datoteki z razširitvijo '.mtimes' in je povezana s pomočjo indeksne datoteke z razširitvijo '.idx'.

- Privzeto je omogočeno vodenje obrnjenega indeksa (revindex) za pack-datoteke. Med testiranjem na repozitoriju torvalds/linux je uporaba obrnjenega indeksa omogočila pospešitev virov intenzivnih operacij „git push“ za 1,49-krat, preproste operacije, kot je izračun velikosti enega objekta z „git cat-file —batch='%(objectsize:disk)'“ pa za 77-krat. Datoteke („.rev“) z obrnjenim indeksom bodo shranjene znotraj repozitorija v mapi „.git/objects/pack“.
Spomnimo, da Git shranjuje vse podatke v obliki objektov, ki so postavljeni v ločene datoteke. Za povečanje učinkovitosti dela z repozitorijem so objekti dodatno shranjeni v pack-datoteke, v katerih je informacija predstavljena v formi toka objektov, ki sledijo drug za drugim (podoben format se uporablja pri prenosu objektov z ukazi git fetch in git push). Za vsak pack-datoteko se ustvari indeksna datoteka (.idx), ki omogoča, da se po identifikatorju objekta zelo hitro določi offset v pack-datoteki, kjer je ta objekt shranjen.
Obrnjen indeks, vključen v novo izdajo, je usmerjen v optimizacijo postopka določanja identifikatorja objekta na podlagi informacij o razporeditvi objekta v pack-datoteki. Prej je bila taka pretvorba izvedena v realnem času med razčlenjevanjem pack-datoteke in shranjena le v pomnilniku, kar ni omogočilo ponovne uporabe takšnih indeksov in je prisililo generirati indeks vsakič znova. Operacija gradnje indeksa se zmanjša na zgraditev niza parov „objekt-položaj“ in njegovo razvrščanje po položaju, kar lahko vzame veliko časa za velike pack-datoteke.
Na primer, operacija izpisa vsebine objektov, pri kateri se uporablja neposredni indeks, je bila izvedena 62-krat hitreje kot operacija prikaza velikosti objektov, za katero podatki o povezavi položaja z objektom niso bili indeksirani. Po uporabi obrnjenega indeksa so navedene operacije začele trajati približno enako dolgo. Obrnjeni indeksi tudi omogočajo pospešitev operacij pošiljanja objektov, ko se izvajajo ukazi fetch in push, s posredno prenosom že pripravljenih podatkov z diska.

- V protokolu »credential helper«, ki se uporablja za prenos poverilnic pri dostopu do repozitorijev z omejenim dostopom, je bila dodana podpora za prenos glave WWW-Authenticate med obdelovalnikom poverilnic in storitvijo, kjer poteka avtentikacija. Podpora za glavo WWW-Authenticate omogoča prenos parametrov obsega OAuth za bolj granulirano ločevanje dostopa uporabnika do repozitorijev in razmejevanje področij, dostopnih za poizvedbe.
- V ukaz »for-each-ref« je bila dodana možnost formatiranja »%(ahead-behind:<base>)«, ki omogoča hkratno pridobivanje informacij o številu commitov, ki so prisotni ali odsotni v določenem oddelku v primerjavi z drugim oddelkom (kolikor eden oddelek zaostaja ali prehiteva drugega na ravni commitov). Prej je bilo za pridobitev podobnih informacij potrebno izvesti dva ločena ukaza: »git rev-list —count main..my-feature« za pridobitev števila unikatnih commitov za oddelek in »git rev-list —count my-feature..main« za pridobitev števila odsotnih commitov. Zdaj je mogoče takšna izračunavanja poenostaviti v en ukaz, kar olajša pisanje obdelovalnikov in skrajša čas izvajanja. Na primer, za prikaz nezdruženih oddelkov in oceno zamude ali prehitevanja njihove glavne veje je mogoče uporabiti enovrstično: $ 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 namesto prej uporabljenega skripta, ki se izvaja 17-krat počasneje: $ 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\n» «$ref» «$ahead» «$behind» done | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3
- V ukaz »git fetch« je bila dodana možnost »—porcelain«, pri čemer se pri navedbi ustvari izhod v formatu »<flag> <old-object-id> <new-object-id> <local-reference>«, ki je manj razumljiv, a bolj uporaben za razreševanje v skriptih.
- Dodana je nastavitev »fetch.hideRefs«, ki omogoča pospešitev operacij »git fetch« z mešanjem dela sklicev v lokalnem repozitoriju v fazi preverjanja pošiljanja celotnega niza objektov, kar omogoča prihranek časa, saj omeji preverjanje le na strežnikov, iz katerih se neposredno izkopavajo podatki. Na primer, pri testiranju sistema s repozitoriji, ki vsebujejo veliko število sledenih zunanjih povezav, so bile izključene vse povezave, razen tistih, naslovljenih na cilj. strežniku $remote je omogočil skrajšanje trajanja operacije 'git fetch' s 20 minut na 30 sekund. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- V ukazu 'git fsck' je bila implementirana funkcionalnost za preverjanje poškodb, skladnosti kontrolnih vsot in pravilnosti vrednosti v bitnih kartah dostopnosti in obratnih indeksih.
- V ukazu 'git clone —local' je bila implementirana napaka pri poskusu kopiranja iz repozitorija, ki vsebuje simbolične povezave znotraj $GIT_DIR.
Izvor: opennet.ru


