De release van het gedistribueerde systeem voor versiebeheer van broncode Git 2.31 is beschikbaar. Git is een van de populairste, meest betrouwbare en hoogpresterende versiebeheersystemen, dat flexibele middelen voor niet-lineaire ontwikkeling biedt, gebaseerd op takken en samengevoegde takken. Om de integriteit van de geschiedenis en de veerkracht tegen wijzigingen 'achteraf' te waarborgen, wordt er impliciet een hash van de hele voorgaande geschiedenis in elke commit gebruikt, en is het ook mogelijk om digitale handtekeningen van ontwikkelaars voor afzonderlijke tags en commits te verifiëren.
In vergelijking met de vorige release zijn er 679 wijzigingen in de nieuwe versie aangenomen, voorbereid met de medewerking van 85 ontwikkelaars, van wie 23 voor het eerst deelnamen aan de ontwikkeling. De belangrijkste vernieuwingen zijn:
- De 'git maintenance'-opdracht is toegevoegd, waarmee periodieke taken kunnen worden uitgevoerd op systemen die geen cron ondersteunen. Bijvoorbeeld, met de nieuwe opdracht kan een periodieke uitvoering van het repository-pakket worden georganiseerd, zodat je niet hoeft te wachten op de voltooiing van de repository-blokkade tijdens de automatische uitvoering van het pakket tijdens het uitvoeren van verschillende opdrachten. De 'git maintenance'-opdracht maakt het mogelijk om optimalisaties en onderhoudsoperaties van de optimale structuur van het repository op de achtergrond uit te voeren, zonder de interactieve sessie te blokkeren - eens per uur wordt een taak uitgevoerd voor het proactief ophalen van nieuwe objecten uit de externe repository en het bijwerken van het bestand met de commit-grafiek, en elke nacht wordt het proces van het pakket van het repository gestart.
- Ondersteuning voor het bijhouden van een omgekeerde index (revindex) op disk voor pack-bestanden is toegevoegd. Ter herinnering: Git slaat alle gegevens op in de vorm van objecten die in afzonderlijke bestanden zijn geplaatst. Om de efficiëntie van het werken met het repository te verbeteren, worden objecten extra in pack-bestanden geplaatst, waarin informatie wordt gepresenteerd in de vorm van een stroom van objecten die elkaar opvolgen (een vergelijkbaar formaat wordt gebruikt bij het overdragen van objecten met de opdrachten git fetch en git push). Voor elk pack-bestand wordt een indexbestand (.idx) gemaakt, waarmee je heel snel het offset in het pack-bestand kunt bepalen waar dit object is opgeslagen op basis van de objectidentificatie. De in Git 2.31 voorgestelde omgekeerde index (.rev) is gericht op het optimaliseren van het proces van het bepalen van de objectidentificatie op basis van informatie over de opslag van het object in het pack-bestand.
Eerder werd een dergelijke transformatie on-the-fly uitgevoerd tijdens het parseren van het pack-bestand en werd deze alleen in het geheugen opgeslagen, wat het hergebruiken van dergelijke indexen onmogelijk maakte en vereiste dat de index elke keer opnieuw werd gegenereerd. De indexbouwoperatie beperkt zich tot het opbouwen van een array van "object-positie" paren en deze te sorteren op positie, wat veel tijd kan kosten voor grote pack-bestanden.
Bijvoorbeeld, de operatie voor het weergeven van de inhoud van objecten, waarbij een directe index wordt gebruikt, was 62 keer sneller dan de operatie voor het tonen van de grootte van objecten, voor welke de gegevens over de relatie tussen positie en object niet geïndexeerd waren. Na het gebruik van de inverse index namen de genoemde operaties ongeveer dezelfde tijd in beslag. Inverse indexen stellen ook in staat om de operaties voor het verzenden van objecten te versnellen bij het uitvoeren van fetch- en push-commando's door de directe overdracht van al voorbereide gegevens van de schijf. Standaard worden inverse indexen niet gemaakt; hun generatie vereiste het inschakelen van de instelling "git config pack.writeReverseIndex true" gevolgd door het opnieuw inpakken van de repository met het commando "git repack -Ad".
- Prestatieoptimalisaties zijn toegevoegd op basis van het verschijnen in het commit-graph bestandsformaat, dat is toegepast voor het optimaliseren van de toegang tot informatie over commits, nieuwe gegevens over het generatie nummer van commits die kunnen worden gebruikt om vaste operaties met commits te versnellen.
- De mogelijkheden voor het overschrijven van de standaard hoofdbranch naam in nieuwe repositories zijn uitgebreid (instelling init.defaultBranch). Bij het raadplegen van externe repositories probeert Git de branch te extraheren waar HEAD naar verwijst, d.w.z. als de externe server standaard de "main" branch gebruikt, dan zal de operatie "git clone" proberen "main" lokaal te extraheren. In Git 2.31 is de ondersteuning voor een dergelijke extractie nu ook geïmplementeerd voor lege repositories. Bijvoorbeeld, bij lokaal klonen van een nieuwe repository voordat de eerste patches erin worden toegevoegd, zal de lokale kopie nu de op externe de server afgestelde naam van de standaard hoofdbranch bevatten.
- Aan de "git rev-list" opdracht is een optie "—disk-usage" toegevoegd, waarmee samenvattende gegevens over de grootte van objecten kunnen worden weergegeven.
- In afwachting van de aanstaande vervanging van de backend voor het uitvoeren van merges, is de detectie van hernoemingen aanzienlijk geoptimaliseerd.
- Ondersteuning voor de verouderde reguliere expressie bibliotheek PCRE1 is beëindigd.
- Er is de mogelijkheid toegevoegd om het gebruik van verkorte links af te dwingen, onafhankelijk van het hash-algoritme. Verbod wordt ingeschakeld door de waarde 'no' toe te kennen aan de parameter core.abbrev.
- De opdracht 'git rev-parse' heeft een optie '—path-format=(absolute|relative)' toegevoegd om expliciet de uitvoer van relatieve of absolute paden te bepalen.
- In scripts voor autocompletion in Bash is het eenvoudiger geworden om aanvulregels voor eigen subcommando's van 'git' toe te voegen.
- De opdracht 'git bundle' heeft de optie '—stdin' toegevoegd om referenties vanuit de standaardinvoer te lezen.
- De opdracht 'git log' heeft een nieuwe optie '—diff-merges=<how>' toegevoegd.
- De opdracht 'git ls-files' heeft de optie '—deduplicatecan' toegevoegd om duplicaten bij de uitvoer te verwijderen.
- Nieuwe maskers voor het uitsluiten van commitbereiken zijn toegevoegd: '<rev>^!' en '<rev>^-<n>'.
- De opdracht 'git range-diff' heeft de opties '—left-only' en '—right-only' toegevoegd om alleen één kant van het te vergelijken bereik te tonen.
- De opdrachten 'git diff' en 'git log' hebben de opties '—skip-to=<path>' en '—rotate-to=<path>' toegevoegd om te springen of naar het einde van de beginpaden te verplaatsen.
- De opdracht 'git difftool' heeft de optie '—skip-to=<path>' toegevoegd om een onderbroken sessie vanaf een willekeurig pad te hervatten.
- De gedragscode (Code-of-conduct), die de belangrijkste principes voor het oplossen van conflicten tussen ontwikkelaars definieert, is bijgewerkt naar versie 2.0 (voorheen versie 1.4).
Bron: opennet.ru
