Efter to måneders udvikling er udgivelsen af det distribuerede system til styring af kildekoder Git 2.51 blevet præsenteret. Git udmærker sig ved høj ydeevne og giver 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 samt bekræftelse med digitale underskrifter af udviklernes enkelte tags og commits. Koden til Git distribueres under GPLv2+-licensen.
Sammenlignet med den tidligere udgave er der blevet accepteret 506 ændringer i den nye version, udarbejdet med deltagelse af 91 udviklere (21 deltager for første gang i udviklingen af Git). De vigtigste nyheder (1, 2, 3):
- Ydeevnen af kommandoerne "git push" og "git fetch" er blevet forbedret i repositories med et stort antal referencer. Forbedringen er opnået ved opdatering af referencer i batchtilstand, hvor flere referencer behandles i én transaktion i stedet for at oprette en separat transaktion for at opdatere hver reference. Optimeringen har væsentligt øget hastigheden af backend "reftable", som nu overgår backend "files" i ydeevne. For eksempel er ydeevnen af "git fetch" i et testrepository med 10.000 referencer steget 22 gange ved brug af backend "reftable", mens den er steget 1,25 gange ved brug af backend "files". For "git push" var stigningen henholdsvis 18 og 1,21 gange.
- Der er blevet foreslået en ny metode til pakning i pack-filer af dele af repositoryet, der ikke er relateret til sporing af uopnåelige objekter, som der ikke er referencer til i repositoryet (ingen grene eller tags peger på dem). Oplysningerne om de uopnåelige objekter opbevares i separate pack-filer ("cruft packs"), hvilket tidligere har krævet, at de blev afspejlet i multipack-indekser MIDX (multi-pack index) for at dække objekter, der oprindeligt var uopnåelige og kun blev opbevaret i cruft-pakken, men som derefter blev opnåelige efter en commit, der henviste til dem.
I den nye version sikres det, at der under repack af pack-filer gemmes ekstra kopier af opnåelige objekter, der kun er lagret i cruft-filer. Denne ændring garanterer, at der i sæt af pack-filer, der bruges til at opbevare opnåelige objekter, ikke findes objekter, der henviser til andre objekter, som er gemt uden for dette sæt. For at ekskludere uopnåeligt indhold fra multipack-indekser (MIDX) af cruft-filer foreslås indstillingen «repack.MIDXMustContainCruft», som markant kan reducere størrelsen af disse indekser. Aktiveringen af indstillingen i GitHub-repositoriet har resulteret i en reduktion af størrelsen af MIDX-indekser med 38%, en hurtigere skrivning til MIDX-indekser med 35%, og en forbedring af læsehastigheden med 5%.
- I kommandoen «git pack-objects» er der tilføjet en mulighed «—path-walk», som aktiverer en ny metode til indsamling af objekter under repack af pack-filer. I stedet for at gennemgå objekterne i rækkefølge af revisioner, bliver objekterne ved brug af «—path-walk»-tilstand gennemgået gennem filstier, hvilket muliggør samtidig pakning af alle objekter med den samme filsti. Denne tilgang gør det muligt at undgå heuristikken, der bruger hashing til at bestemme forbindelsen mellem objektet og dets filsti, samt slippe for sorteringen af objekter før pakning. Ved brug af «—path-walk»-tilstand bliver størrelsen af de genererede pack-filer betydeligt mindre end ved gruppering af objekter ved hjælp af hashes.
- Der er defineret et format til udveksling af gemte tilstande for arbejdstræet og indekser i repositoriet, der oprettes ved hjælp af kommandoen «git stash». Det nye format muliggør kodning af gemte ændringer (stash-poster) som en sekvens af commits. Til import og eksport foreslås underkommandoerne «git stash import» og «git stash export», som kan bruges til at overføre gemte tilstande fra et system til et andet og udføre push eller pull operationer med disse tilstande som almindelige grene eller tags. git stash export —to-ref refs/stashes/my-stash git push origin refs/stashes/my-stash … git fetch origin ‘+refs/stashes/*:refs/stashes/*’ git stash import refs/stashes/my-stash
- I kommandoen «git cat-file», der viser indholdet af angivne objekter, er der ved brug af indstillingerne «—batch» og «—batch-check» indført en mulighed for at vise oplysninger om manglende objekter (f.eks. på grund af beskadigelse af repository) og submoduler. Tidligere viste kommandoen «git cat-file —batch-check» for et submodul «missing», men nu viser den objektets identifikator.
- I kommandoen «git log» er der implementeret optimeringer baseret på Bloom-filtre for at fremskynde søgningen i ændringshistorikken ved angivelse af filtre med flere filstier, f.eks. «git log — path/to/a path/to/b».
- Kommandoerne «git switch» og «git restore» er stabiliseret, efter at de har været betragtet som eksperimentelle siden 2019. Kommandoerne præsenteres som de moderne ækvivalenter til «git checkout», som adskiller så lidt relaterede funktioner i denne kommando, som manipulation af grene (skift og oprettelse) og genopretning af filer i arbejdsbiblioteket.
- Kommandoen «git whatchanged», der svarer til «git log —raw», er blevet erklæret forældet og planlagt til fjernelse i Git 3.0.
- I kommandoen «git for-each-ref» er der tilføjet en indstilling «—start-after», der kan bruges sammen med indstillingen «—count» til at organisere pagineret output.
- I kommandoerne «git merge» og «git pull» er der tilføjet en indstilling «—compact-summary» til at bruge et kompakt format til opsummering af ændringer i stedet for diffstat-formatet.
- I Git-kodebasen er brugen af nøgleordet «bool», der opstod i C99-standarden, blevet tilladt. Der er også dokumenteret nogle C99-muligheder, der eksperimentelt anvendes i Git (f.eks. planlægges det at tillade anvendelse af konstruktioner som «(struct foo){ .member = value };» i midten af 2026). En compilator, der understøtter C99, er obligatorisk for Git fra 2021, men C99-specifikationens muligheder implementeres meget forsigtigt for at bevare kompatibilitet med compilatorer, der kun delvist understøtter denne standard.
- Der er foretaget ændringer i reglerne for patch-modtagelse, som tillader indsendelse af patches under et kaldenavn i stedet for kun under udviklerens rigtige navn. Ændringen er i overensstemmelse med patch-modtagerreglerne i Linux-kernen.
- Listen over inkompatible ændringer, der vil blive anvendt i Git 3.0, er blevet opdateret. Blandt de væsentlige ændringer i den kommende Git 3.0-udgivelse er standardovergangen til objekt-id'er baseret på SHA-256 hash-algoritmen ved initiering af nye repositories samt implementeringen af „reftable“-formatet til opbevaring af links til grene og tags i repository'et (anvender bloklagring fra JGit-projektet, optimeret til opbevaring af et meget stort antal links).
Kilde: opennet.ru
