Na twee maanden ontwikkeling is de release van het gedistribueerde systeem voor versiebeheer van broncodes Git 2.51 gepresenteerd. Git staat bekend om zijn hoge prestaties en biedt middelen voor niet-lineaire ontwikkeling, gebaseerd op het splitsen en samenvoegen van takken. Om de integriteit van de geschiedenis en resistentie tegen 'backdating' te waarborgen, wordt impliciete hashing van de gehele vorige geschiedenis in elke commit gebruikt, evenals de authenticatie van digitale handtekeningen van ontwikkelaars voor afzonderlijke tags en commits. De code van Git wordt verspreid onder de GPLv2+ licentie.
In vergelijking met de vorige release zijn er 506 wijzigingen in de nieuwe versie opgenomen, voorbereid door 91 ontwikkelaars (waarvan 21 voor het eerst deelnamen aan de ontwikkeling van Git). Belangrijkste vernieuwingen (1, 2, 3):
- De prestaties van de commando's 'git push' en 'git fetch' zijn verhoogd in repositories met een groot aantal referenties. De versnelling is bereikt door de referenties in batchmodus bij te werken, waarbij meerdere referenties in één transactie worden verwerkt, in plaats van voor elke referentie een aparte transactie te creëren. Deze optimalisatie heeft de snelheid van de 'reftable' backend aanzienlijk verhoogd, die nu de 'files' backend overtreft in prestaties. Bijvoorbeeld, in een testrepository met 10.000 referenties steeg de prestatie van 'git fetch' bij gebruik van de 'reftable' backend met 22 keer, terwijl het bij gebruik van de 'files' backend met 1,25 keer steeg. Voor 'git push' bedroeg de verhoogde prestatie respectievelijk 18 en 1,21 keer.
- Een nieuwe methode voor het verpakkingen in pack-bestanden van delen van de repository, die niet gerelateerd zijn aan het traceren van onbereikbare objecten waarop in de repository geen referenties aanwezig zijn (zoals takken of tags). Informatie over onbereikbare objecten wordt opgeslagen in afzonderlijke pack-bestanden ('cruft packs'), wat leidde tot de noodzaak van hun representatie in multi-pack indexen MIDX (multi-pack index) om objecten te dekken die oorspronkelijk onbereikbaar waren en alleen in het cruft-pakket waren opgeslagen, maar vervolgens bereikbaar werden na een refererende commit.
In de nieuwe versie worden bij het opnieuw verpakken van pack-bestanden extra kopieën van bereikbare objecten, opgeslagen in cruft-bestanden, behouden. Deze wijziging garandeert dat de set pack-bestanden die voor het opslaan van bereikbare objecten wordt gebruikt, geen objecten bevat die naar andere objecten verwijzen die buiten deze set zijn opgeslagen. Voor het uitsluiten van onbereikbare inhoud uit multi-pack-indexen (MIDX) wordt de instelling 'repack.MIDXMustContainCruft' voorgesteld, die het mogelijk maakt om de grootte van dergelijke indexen aanzienlijk te verkleinen. Het inschakelen van deze instelling in de GitHub-repository heeft geleid tot een vermindering van de grootte van de MIDX-indexen met 38%, een versnelling van het schrijven naar MIDX-indexen met 35% en een verbetering van de leessnelheid met 5%.
- In de 'git pack-objects'-commando is de optie '--path-walk' toegevoegd, die een nieuwe methode voor het verzamelen van objectinformatie introduceert bij het opnieuw verpakken van pack-bestanden. In plaats van objecten in de volgorde van revisies te doorlopen, worden bij het gebruik van de '--path-walk'-modus objecten door middel van bestandsroutes doorlopen, waardoor alle objecten met dezelfde bestandsroute in één keer kunnen worden verpakt. Deze benadering maakt het mogelijk om de heuristiek die hashing gebruikt om de relatie tussen een object en zijn bestandsroute vast te stellen, uit te sluiten en om de objecten te sorteren voordat ze worden verpakt. Bij gebruik van de '--path-walk'-modus is de grootte van de gegenereerde pack-bestanden aanzienlijk kleiner dan bij het groeperen van objecten op basis van hashes.
- Een formaat is vastgesteld voor het uitwisselen van opgeslagen status van de werkboom en indexen in de repository, gemaakt met behulp van het 'git stash'-commando. Het nieuwe formaat maakt het mogelijk om opgeslagen wijzigingen (stash-opnamen) te coderen in de vorm van een reeks commits. Voor importeren en exporteren zijn de subcommando's 'git stash import' en 'git stash export' voorgesteld, die kunnen worden gebruikt om opgeslagen staten van het ene systeem naar het andere over te brengen en om push- of pull-operaties met deze staten uit te voeren als met gewone takken of 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
- In het commando «git cat-file», dat de inhoud van opgegeven objecten weergeeft, is met de opties «—batch» en «—batch-check» de mogelijkheid geïmplementeerd om informatie over ontbrekende objecten (bijvoorbeeld als gevolg van beschadiging van de repository) en submodules weer te geven. Eerder gaf het commando «git cat-file —batch-check» bij het opgeven van een pad naar de submodule «missing» weer, maar nu toont het de objectidentificator.
- In het commando «git log» zijn optimalisaties met behulp van Bloom-filters geïmplementeerd om het zoeken in de wijzigingsgeschiedenis te versnellen wanneer filters met meerdere padnamen worden opgegeven, bijvoorbeeld «git log — path/to/a path/to/b».
- De commando's «git switch» en «git restore» zijn gestabiliseerd, die sinds 2019 als experimenteel werden beschouwd. Deze commando's worden gepresenteerd als moderne equivalenten van «git checkout», die zo weinig verwante functionaliteiten van dit commando scheiden, zoals het manipuleren van branches (overschakelen en creëren) en het herstellen van bestanden in de werkdirectory.
- Het commando «git whatchanged», dat gelijk is aan «git log —raw», is als verouderd verklaard en gepland voor verwijdering in de Git 3.0 branche.
- De optie «—start-after» is toegevoegd aan het commando «git for-each-ref», die samen met de optie «—count» kan worden gebruikt om paginering te organiseren.
- De commando's «git merge» en «git pull» hebben de optie «—compact-summary» gekregen voor het gebruik van een compact formaat voor samenvattende informatie over wijzigingen in plaats van het diffstat-formaat.
- In de Git-codebase is het gebruik van het sleutelwoord «bool», dat in de C99-standaard is verschenen, toegestaan. Ook zijn enkele mogelijkheden van C99 gedocumenteerd die experimenteel in Git worden gebruikt (bijvoorbeeld medio 2026 is het gepland om de constructies «(struct foo){ .member = value };» toe te staan). Een compiler die C99 ondersteunt, is verplicht voor Git sinds 2021, maar de mogelijkheden van de C99-specificatie worden uiterst voorzichtig geïmplementeerd om compatibiliteit met compilers die deze standaard slechts gedeeltelijk ondersteunen te behouden.
- Er zijn wijzigingen aangebracht in de regels voor het indienen van patches, waardoor het nu is toegestaan om patches onder een pseudoniem in te dienen, en niet alleen onder de echte naam van de ontwikkelaar. Deze wijziging komt overeen met de regels voor het indienen van patches in de Linux-kernel.
- De lijst met incompatibiliteitsproblemen is geüpdatet, die van toepassing zullen zijn in de Git 3.0 tak. Een belangrijke wijziging in de aanstaande release van Git 3.0 is de standaard overstap naar objectidentificaties op basis van het SHA-256 hash-algoritme bij het initialiseren van nieuwe repositories en het gebruik van het 'reftable'-formaat voor het opslaan van verwijzingen naar takken en tags in de repository (gebaseerd op de blokopslag van het JGit-project, geoptimaliseerd voor het opslaan van een zeer groot aantal verwijzingen).
Bron: opennet.ru
