Efter tre måneders udvikling er udgaven af det distribuerede system til styring af kildekoder, Git 2.41, offentliggjort. Git er et af de mest populære, pålidelige og højtydende versionsstyringssystemer, der tilbyder fleksible værktøjer til ikke-lineær udvikling, baseret på forgrening og sammensmeltning af grene. For at sikre integriteten af historikken og modstandsdygtighed over for "tilbagevirkende" ændringer anvendes implicit hashing af hele den tidligere historie i hver commit. Det er også muligt at bekræfte digitale signaturer fra udviklerne af individuelle tags og commits.
Sammenlignet med den tidligere udgave er der i den nye version foretaget 542 ændringer, forberedt med deltagelse af 95 udviklere, hvoraf 29 deltager i udviklingen for første gang. De vigtigste nyheder:
- Behandlingen af utilgængelige objekter (unreachable), som der ikke henvises til i depotet (hverken af grene eller tags), er blevet forbedret. Utilgængelige objekter fjernes af affaldsindsamleren, men forbliver i depotet i et bestemt tidsrum for at undgå race-tilstande, før de slettes. For at spore den tid, utilgængelige objekter forbliver, skal der knyttes etiketter med ændringstidspunkt for sådanne objekter, hvilket forhindrer opbevaring af disse i én pack-fil, hvor alle objekter har et fælles ændringstidspunkt. Tidligere blev hvert utilgængeligt objekt gemt i en separat fil, hvilket førte til problemer, når der var et stort antal friske utilgængelige objekter, der endnu ikke var underlagt sletning. I den nye udgave anvendes mekanismen "cruft packs" som standard til pakning af utilgængelige objekter, hvilket muliggør opbevaring af alle utilgængelige objekter i én pack-fil, mens data om ændringstidspunktet for hvert objekt afspejles i en separat tabel, der opbevares i en fil med endelsen ".mtimes" og knyttes ved hjælp af en indeksfil med endelsen ".idx".

- Der er som standard indført opbevaring af en omvendt indeks (revindex) på disken for pack-filer. Ved testning på depotet torvalds/linux gjorde anvendelsen af den omvendte indeks det muligt at accelerere ressourcekrævende operationer som "git push" med 1,49 gange, mens simple operationer, såsom at beregne størrelsen på et enkelt objekt ved hjælp af "git cat-file —batch=’%(objectsize:disk)'", blev fremskyndet med 77 gange. Filer (".rev") med omvendte indekser vil blive gemt inde i depotet i mappen ".git/objects/pack".
Husk at Git gemmer alle data i form af objekter, der placeres i separate filer. For at forbedre effektiviteten ved arbejde med repositoryer placeres objekterne desuden i pack-filer, hvor informationen præsenteres som en strøm af objekter, der følger efter hinanden (et tilsvarende format bruges ved overførsel af objekter med kommandoerne git fetch og git push). For hver pack-fil oprettes en indeksfil (.idx), som gør det muligt hurtigt at bestemme forskydningen i pack-filen, hvor dette objekt er gemt, ud fra objektets ID.
Den nye version inkluderer en omvendt indeks, der har til formål at optimere processen til at bestemme objekt-ID'et ud fra information om objektets placering i pack-filen. Tidligere blev denne konvertering udført on-the-fly under parsing af pack-filen og blev kun gemt i hukommelsen, hvilket forhindrede genbrug af sådanne indekser og gjorde det nødvendigt at generere indekset hver gang. Indeksopbygning indebærer at bygge et array af par "objekt-position" og sortere det efter position, hvilket kan tage meget tid for store pack-filer.
For eksempel blev operationen til at udskrive indholdet af objekter, hvor der anvendes direkte indeks, udført 62 gange hurtigere end operationen, der viste størrelsen af objekterne, for hvilken data om forbindelsen mellem positionen og objektet ikke blev indekseret. Efter brug af omvendt indeks tog de nævnte operationer cirka den samme tid. Omvendte indekser gør det også muligt at fremskynde operationer til sending af objekter under udførelse af fetch- og push-kommandoer ved direkte at overføre de allerede forberedte data fra disken.

- I protokollen "credential helper", der anvendes til at overføre legitimationsoplysninger ved adgang til repositories med begrænset adgang, er der tilføjet støtte til at overføre WWW-Authenticate headers mellem legitimationsbehandleren og tjenesten, der udfører autentificeringen. Støtte til WWW-Authenticate headeren gør det muligt at overføre scope-parametre for OAuth til en mere granulær opdeling af brugerens adgang til repositories og begrænsning af områder, der er tilgængelige for forespørgsler.
- I kommandoen for-each-ref er der tilføjet en formateringsmulighed «%(ahead-behind:)», som gør det muligt at få oplysninger om antallet af commits, der er til stede eller fraværende i en bestemt gren i forhold til en anden gren (hvor meget en gren ligger bagud eller ligger foran en anden på commit-niveau). Tidligere krævede det at udføre to separate kommandoer: «git rev-list —count main..my-feature» for at få antallet af unikke commits for grenen og «git rev-list —count my-feature..main» for at få antallet af manglende commits. Nu kan sådanne beregninger reduceres til én kommando, hvilket forenkler skrivningen af håndteringsscripts og reducerer udførelsestiden. For eksempel kan man bruge en engangskommando til at vise ikke-fusionerede grene og vurdere, om de ligger bagud eller foran i forhold til deres hovedgren: $ 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 i stedet for det tidligere anvendte script, som kørte 17 gange langsommere: $ 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
- I kommandoen «git fetch» er der tilføjet en mulighed «—porcelain», som, når den angives, genererer output i formatet « », som er mindre læsevenligt, men mere praktisk for skripter.
- Der er tilføjet en indstilling «fetch.hideRefs», som muliggør hurtigere operationer «git fetch» ved at skjule nogle referencer i det lokale repository under kontrollen af serverens afleveringspakke af objekter, hvilket sparer tid ved kun at begrænse kontrollen til servere, hvorfra der direkte hentes data. For eksempel, ved at udføre en test på et system med repositories, der indeholder et stort antal overvågede eksterne referencer, gjorde udelukkelse af alle referencer undtagen dem, der blev sendt til destinationen server $remote, det muligt at reducere udførelsestiden for operationen «git fetch» fra 20 minutter til 30 sekunder. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- I kommandoen «git fsck» er der implementeret en mulighed for at kontrollere for skader, kontrolsumoverensstemmelser og korrekthed af værdierne i tilgængelighedsbitmaper og omvendte indekser.
- I teamet «git clone —local» er der implementeret en fejlmeddelelse ved forsøg på at kopiere fra et repository, der indeholder symbolske links inden for $GIT_DIR.
Kilde: opennet.ru


