Na drie maanden ontwikkeling is de release van het gedistribueerde systeem voor versiebeheer van platte tekst Git 2.52 gepresenteerd. Git staat bekend om zijn hoge prestaties en biedt hulpmiddelen voor niet-lineaire ontwikkeling, gebaseerd op vertakkingen en samenvoegen van takken. Om de integriteit van de geschiedenis te waarborgen en bestand te zijn tegen retroactieve wijzigingen, wordt impliciete hashing van de volledige voorgaande geschiedenis gebruikt in elke commit, evenals de digitale handtekeningen van ontwikkelaars voor afzonderlijke tags en commits. De Git-code wordt verspreid onder de GPLv2+ licentie.
Vergeleken met de vorige release zijn er in deze nieuwe versie 637 wijzigingen opgenomen, voorbereid met deelname van 94 ontwikkelaars (33 hebben voor het eerst bijgedragen aan de ontwikkeling van Git). Belangrijkste nieuwigheden (1, 2, 3):
- Er is een commando 'git last-modified' toegevoegd om een lijst van bestanden in de opgegeven revisie en commits te tonen, waarmee de laatste wijzigingen in elk van deze bestanden zijn aangebracht. $ git last-modified HEAD b56f6dcd7b4c90192018e848d0810f091d092913 test.h 29330ae4b820147c98e723399e9438c8bee60a8a test1.c 573ad8917beb99dc643b6e7f5c117a294384a575 test2.c
- Er is een commando 'git repo' toegevoegd om acties uit te voeren die verband houden met het ophalen van informatie uit de repository. Twee subcommando's zijn voorgesteld: 'git repo info' en 'git repo structure', die informatie over de instellingen van de repository en gegevens over de structuur van de repository weergeven (bijvoorbeeld het aantal referenties en objecten in de repository). $ git repo info object.format references.format object.format=sha1 references.format=reftable $ git repo structure | Repositorystructuur | Waarde | | ——————— | —— | | * Referenties | | | * Aantal | 1983 | | * Takken | 4 | | * Tags | 1125 | | * Remotes | 854 | | * Anderen | 0 | | | | | * Bereikbare objecten | | | * Aantal | 518955 | | * Commits | 77469 | | * Bomen | 188865 | | * Blobs | 251631 | | * Tags | 990 |
- In het commando 'git refs' zijn drie subcommando's toegevoegd die de desgewenste en overlappende laag-niveau operaties op referenties unificeren (git for-each-ref, git show-ref, git update-ref en git pack-refs):
- ‘git refs optimize’ — optimalisatie van de backend opslag van referenties (vergelijkbaar met ‘git pack-refs’).
- ‘git refs list’ — wordt gebruikt om een lijst van alle referenties weer te geven (vergelijkbaar met ‘git for-each-ref’ of ‘git show-ref’).
- ‘git refs exists’ — controleert het bestaan van een referentie (vergelijkbaar met ‘git show-ref —exists’).
- Het export- of importformaat van de commitgeschiedenis is uitgebreid met de mogelijkheid om te werken met cryptografische handtekeningen, die gebruik maken van zowel SHA-1 als SHA-256 als objectidentificators. In de ‘git fast-import’ opdracht is ondersteuning toegevoegd voor het verwerken van ondertekende tags, vergelijkbaar met ondertekende commits. Er zijn opties ‘—signed-commits=’ en ‘—signed-tags=’ toegevoegd voor het beheren van de verwerking van ondertekende commits en tags tijdens de importfase (de modus kan waarden aannemen zoals verbatim, warn-verbatim, warn-stri, strip of abort).
- In de ‘git maintenance’ opdracht is ondersteuning toegevoegd voor een nieuwe strategie ‘geometric’ (‘git config set maintenance.strategy geometric’), waarmee de onderhoudstijd van grote monorepositories kan worden verkort. In vergelijking met de eerder beschikbare strategie, die dezelfde logica volgt als in de ‘git gc’ opdracht, vermijdt de nieuwe strategie het opnieuw verpakken van alle objecten en sluit ze resource-intensieve bewerkingen uit, zoals het samenvoegen van alle pack-bestanden (waar mogelijk wordt de samenvoeging in delen en zonder opschoning van verwijderde objecten uitgevoerd).
- De opdracht ‘git sparse-checkout clean’ is toegevoegd om het herstel van de toestand van de werkdirectory te vereenvoudigen door bestanden te verwijderen die niet voldoen aan de nieuwe definitie van sparse-checkout, en die niet in de lokale kopie aanwezig moeten zijn volgens de huidige sparse-checkout instellingen.
- Om de codebasis te ontdoen van complicaties en de onderhoudbaarheid te vereenvoudigen, is er een refactoring uitgevoerd om het gebruik van de globale variabele the_repository te verminderen.
- De toepassing van Bloom-filters is uitgebreid, een probabilistische structuur voor het controleren van de aanwezigheid in een verzameling, die valse aanwijzingen van een afwezig element toestaat, maar het overslaan van bestaande elementen uitsluit. Bloom-filters worden nu gebruikt om het zoeken in de wijzigingsgeschiedenis te versnellen wanneer maskers in bestands paden worden opgegeven, bijvoorbeeld ‘foo/bar/*/baz’.
- De prestaties van de opdracht ‘git describe’ zijn met 30% verbeterd door gebruik te maken van een prioriteitswachtrij. In ‘git remote rename’ zijn de hernoemingsoperaties versneld. In ‘git ls-files’ is de toepassing van indexen uitgebreid. De prestaties van de opdracht ‘git log -L’ zijn aanzienlijk versneld door overbodige drie-niveau vergelijkingen bij het verwerken van samengevoegde commits uit te sluiten. Er zijn optimalisaties doorgevoerd in de xdiff-bibliotheek.
- Er is een optionele mogelijkheid geïmplementeerd voor het gebruik van Rust-implementaties voor bepaalde interne functies, zoals het coderen en decoderen van variabele lengte geheel getallen. Standaard wordt Rust-code niet gebruikt en om het in te schakelen, is het nodig de bouwvlag WITH_RUST op te geven. In de toekomst is er een herziening van aanzienlijke interne componenten van Git naar Rust voorzien en zal Rust een van de verplichte bouwafhankelijkheden in Git 3.0 worden.
- De lijst met incompatibele wijzigingen die zullen worden doorgevoerd in de Git 3.0-tak is bijgewerkt. In Git 3.0 is besloten om de standaardinstelling voor init.defaultBranch te wijzigen naar 'main', dat wil zeggen dat in repository's die zijn gemaakt met het commando 'git init', de standaardbranch 'main' zal heten in plaats van 'master'. Ook is de overgang naar objectidentificatoren op basis van het SHA-256 hash-algoritme bij de initialisatie van nieuwe repositories gemarkeerd. Voor gemakkelijke overdracht tussen repositories met SHA-1 en SHA-256 hash-object-identificatoren wordt de mogelijkheid geboden om push- en pull-operaties uit te voeren in een repository met het ene hashingalgoritme, vanuit een repository die een ander hashingalgoritme gebruikt.
Bron: opennet.ru
