Na drie maanden ontwikkeling is de gedistribueerde versie van het broncodebeheersysteem Git 2.41 uitgebracht. Git is een van de meest populaire, betrouwbare en krachtige versiebeheersystemen die flexibele middelen voor niet-lineaire ontwikkeling biedt, gebaseerd op het takken en samenvoegen van branches. Om de integriteit van de geschiedenis en weerstand tegen 'backward' wijzigingen te waarborgen, gebruikt Git impliciete hashing van de volledige vorige geschiedenis in elke commit. Het is ook mogelijk om digitale handtekeningen van ontwikkelaars te gebruiken voor afzonderlijke tags en commits.
In vergelijking met de vorige release zijn er 542 wijzigingen in de nieuwe versie opgenomen, voorbereid door 95 ontwikkelaars, van wie 29 voor het eerst hebben deelgenomen aan de ontwikkeling. Hoofd nieuwigheden:
- De verwerking van onbereikbare objecten is verbeterd; deze zijn objecten zonder verwijzingen in de repository (geen takken of tags wijzen erop). Onbereikbare objecten worden door de garbage collector verwijderd, maar blijven een bepaalde tijd in de repository om racecondities te voorkomen. Om de periode van aanwezigheid van onbereikbare objecten bij te houden, moeten er labels aan hen worden gekoppeld die de wijzigingstijd zichtbaar maken, wat het opslaan in ƩƩn pack-bestand bemoeilijkt, omdat alle objecten een gezamenlijke wijzigingstijd hebben. Vroeger werd elk onbereikbaar object in een apart bestand opgeslagen, wat leidde tot problemen bij het hebben van een groot aantal recente onbereikbare objecten die nog niet voor verwijdering in aanmerking kwamen. In de nieuwe release wordt standaard gebruik gemaakt van het 'cruft packs'-mechanisme om onbereikbare objecten in ƩƩn pack-bestand op te slaan, waarbij gegevens over het wijzigingstijdstip van elk object in een aparte tabel worden weergegeven, opgeslagen in een bestand met de extensie '.mtimes' en gekoppeld aan een indexbestand met de extensie '.idx'.

- Standaard is het bijhouden van een omgekeerde index (revindex) voor pack-bestanden ingeschakeld. Bij het testen op de torvalds/linux repository heeft de toepassing van de omgekeerde index de resource-intensieve 'git push' operaties met 1,49 keer versneld, terwijl eenvoudigere operaties, zoals het berekenen van de grootte van een object met 'git cat-file --batch='%(objectsize:disk)'', met 77 keer zijn versneld. Bestanden (ā.revā) met een omgekeerde index worden binnen de repository opgeslagen in de map '.git/objects/pack'.
Ter herinnering: Git slaat alle gegevens op in de vorm van objecten, die in afzonderlijke bestanden worden geplaatst. Om de efficiƫntie van het werken met de repository te verbeteren, worden objecten bovendien in pack-bestanden geplaatst, waarin informatie wordt gepresenteerd als een stroom van objecten die achtereenvolgens volgen (een soortgelijk formaat wordt gebruikt bij het verzenden van objecten met de git fetch en git push commando's). Voor elk pack-bestand wordt een indexbestand (.idx) aangemaakt, waarmee op object-ID zeer snel de offset in het pack-bestand kan worden bepaald waar dat object is opgeslagen.
De omgekeerde index die in de nieuwe versie is ingeschakeld, is gericht op het optimaliseren van het proces van het bepalen van de object-ID op basis van informatie over de plaatsing van het object in het pack-bestand. Voorheen werd dergelijke conversie on-the-fly uitgevoerd tijdens het parseren van het pack-bestand en werd deze alleen in het geheugen opgeslagen, waardoor het niet mogelijk was om dergelijke indexen opnieuw te gebruiken en het noodzakelijk was om de index elke keer opnieuw te genereren. De indexeringsoperatie bestaat uit 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 om de inhoud van objecten weer te geven waarbij een directe index wordt gebruikt, werd 62 keer sneller uitgevoerd dan de operatie om de grootte van objecten weer te geven, voor welke de gegevens over de relatie tussen positie en object niet geĆÆndexeerd waren. Na het gebruik van de omgekeerde index namen de opgegeven operaties ongeveer dezelfde tijd in beslag. Omgekeerde indexen versnellen ook de operaties voor het verzenden van objecten bij het uitvoeren van fetch- en push-commando's door de directe overdracht van reeds beschikbare gegevens vanaf de schijf.

- In het protocol 'credential helper', dat wordt gebruikt voor het verzenden van inloggegevens bij het benaderen van repositories met beperkte toegang, is ondersteuning toegevoegd voor het doorgeven van WWW-Authenticate headers tussen de credential handler en de service waarin de authenticatie plaatsvindt. Ondersteuning voor de WWW-Authenticate header maakt het mogelijk om scope-parameters van OAuth door te geven voor een fijnmaziger scheiding van de toegang van de gebruiker tot de repositories en de gebieden die beschikbaar zijn voor aanvragen.
- De for-each-ref opdracht heeft een formatteringsoptie '%(ahead-behind:)' gekregen, waarmee je in ƩƩn keer informatie kunt krijgen over het aantal commits dat aanwezig of afwezig is in een bepaalde branch ten opzichte van een andere branch (hoeveel een branch achterloopt of voorloopt in termen van commits). Voorheen moest je twee aparte opdrachten uitvoeren om dergelijke informatie te krijgen: 'git rev-list --count main..my-feature' voor het aantal unieke commits voor de branch en 'git rev-list --count my-feature..main' voor het aantal ontbrekende commits. Nu kunnen deze berekeningen tot ƩƩn opdracht worden beperkt, wat het schrijven van handlers vereenvoudigt en de uitvoeringstijd verkort. Bijvoorbeeld, om niet-gezamenlijke branches weer te geven en hun achterstand of voorsprong ten opzichte van de hoofdbranch te beoordelen, kun je de volgende one-liner gebruiken: $ 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 in plaats van het eerder gebruikte script dat 17 keer langzamer is: $ 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\n' '$ref' '$ahead' '$behind' done | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref--exclude 16 96 tb/roaring-bitmaps 47 3
- De 'git fetch' opdracht heeft een optie '--porcelain' gekregen, waarmee een uitvoerformat wordt gegenereerd van ' ', dat minder leesbaar is, maar handiger voor parsing in scripts.
- Er is een instelling 'fetch.hideRefs' toegevoegd, die de 'git fetch' operaties versnelt door een deel van de referenties in de lokale repository te verbergen tijdens de controle of de server het volledige set objecten heeft verzonden, wat tijd bespaart door de controle te beperken tot alleen die. servers, waarvan gegevens rechtstreeks worden geƫxtraheerd. Bijvoorbeeld, bij het testen op een systeem met repositories die een groot aantal externe links bijhouden, worden alle links uitgesloten, behalve de links die gericht zijn op de doel server $remote, waardoor de uitvoering van de operatie 'git fetch' is verkort van 20 minuten naar 30 seconden. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- De 'git fsck' opdracht biedt nu de mogelijkheid om beschadigingen, de overeenkomstigheid van controlegetallen en de correctheid van waarden in de bitmaps van beschikbaarheid en terugindexen te controleren.
- De 'git clone --local' opdracht genereert nu een foutmelding bij het proberen om te kopiƫren van een repository die symbolische links bevat binnen $GIT_DIR.
Bron: opennet.ru


