De release van het gedistribueerde systeem voor versiebeheer Git 2.37 is gepresenteerd. Git is een van de meest populaire, betrouwbare en krachtige versiebeheersystemen, met flexibele hulpmiddelen voor niet-lineaire ontwikkeling, gebaseerd op takken en samenvoegingen. Voor de waarborging van de integriteit van de geschiedenis en de weerstand tegen 'terugwerkende' wijzigingen, wordt impliciete hashing van de volledige vorige geschiedenis in elke commit gebruikt, en het is ook mogelijk om digitale handtekeningen van ontwikkelaars voor afzonderlijke tags en commits te verifiëren.
In vergelijking met de vorige release zijn er 395 wijzigingen in de nieuwe versie opgenomen, voorbereid met de betrokkenheid van 75 ontwikkelaars, van wie 20 voor het eerst deelnamen aan de ontwikkeling. Belangrijkste vernieuwingen:
- De mechanismen voor partiële indexen (sparse index) zijn gereedgemaakt voor algemeen gebruik, die slechts een deel van de repository dekken. Partiële indexen verhogen de prestaties en besparen ruimte in repositories waar partiële kloning (sparse-checkout) of werken met een onvolledige kopie van de repository plaatsvindt. In deze nieuwe release is het werk aan de integratie van partiële indexen in de opdrachten 'git show', 'git sparse-checkout' en 'git stash' afgerond. De meest opvallende prestatiewinst van het gebruik van partiële indexen wordt waargenomen in de opdracht 'git stash', waarvan de uitvoeringssnelheid in sommige situaties met 80% is toegenomen.
- Een nieuw mechanisme voor 'cruft packs' is geïmplementeerd voor de packaging van onbereikbare objecten (unreachable), waarvoor in de repository geen verwijzingen aanwezig zijn (geen takken of tags verwijzen ernaar). Onbereikbare objecten worden door de garbage collector verwijderd, maar blijven gedurende een bepaalde tijd in de repository om racecondities te voorkomen. Om de periode waarin onbereikbare objecten aanwezig zijn bij te houden, is het noodzakelijk om ze te koppelen aan labels met de wijzigingstijd van soortgelijke objecten, wat het niet mogelijk maakt om ze in één pack-bestand op te slaan, waarin alle objecten een gemeenschappelijke wijzigingstijd hebben. Het eerder gebruikte opslaan van elk object in een apart bestand leidde tot problemen bij een groot aantal nieuwe onbereikbare objecten die nog niet voor verwijdering in aanmerking kwamen. Het voorgestelde mechanisme van 'cruft packs' maakt het mogelijk om alle onbereikbare objecten in één pack-bestand op te slaan, terwijl informatie over de wijzigingstijd van elk object in een aparte tabel wordt vastgelegd, die wordt opgeslagen in een bestand met de extensie '.mtimes'.
- Voor Windows en macOS is een ingebouwd mechanisme voor het volgen van wijzigingen in het bestandssysteem geïmplementeerd, waarmee het zonder het doorzoeken van de gehele werkdirectory mogelijk is om operaties zoals 'git status' uit te voeren. Eerder konden externe hulpprogramma's voor het volgen van wijzigingen in het FS, zoals Watchman, via hooks worden aangesloten om wijzigingen te volgen, maar dit vereiste de installatie van extra programma's en configuratie. Nu is deze functionaliteit ingebouwd en kan deze worden ingeschakeld met het commando 'git config core.fsmonitor true'.
- In het team 'git sparse-checkout' is de ondersteuning voor de alternatieve modus '--cone' voor de methode van patroonbepaling voor gedeeltelijk clonen verouderd verklaard, waarmee het mogelijk was om bij het bepalen van het gedeelte van de repository dat onder de kloonoperatie valt, afzonderlijke bestanden op te sommen met behulp van de syntaxis van '.gitignore', wat het gebruik van gedeeltelijke indexen voor optimalisatie niet mogelijk maakt.
- De flexibiliteit van de fsync() aanroep om wijzigingen naar schijf te schrijven is verhoogd. De parameter «core.fsyncMethod» heeft nu ondersteuning voor de synchronisatiestrategie «batch», die de prestaties verbetert bij het schrijven van een groot aantal afzonderlijke bestanden door veranderingen in de backbuffer te accumuleren en deze met één fsync() aanroep weg te schrijven. Een uitgevoerde test waarbij 500 bestanden met de opdracht «git add» werden toegevoegd, werd uitgevoerd in 0,15 seconden met de nieuwe modus ingeschakeld, terwijl het aanroepen van fsync() voor elk bestand 1,88 seconden duurde, en zonder gebruik van fsync — 0,06 seconden.
- Aan de commando's voor het doorlopen van takken, zoals «git log» en «git rev-list», is de optie «—since-as-filter=X» toegevoegd, die het mogelijk maakt om commits die ouder zijn dan «X» te filteren. In tegenstelling tot de optie «—since» is het nieuwe commando geïmplementeerd als een filter, dat de iteratie niet stopt na de eerste commit die ouder is dan de opgegeven tijd.
- Bij de «git remote» opdracht wordt informatie over gedeeltelijke klonen van de repository weergegeven wanneer de vlag «-v» is opgegeven.
- Er is een instelling «transfer.credentialsInUrl» toegevoegd, die de waarden «warn», «die» en «allow» kan aannemen. In het geval dat in de parameter «remote..url» inloggen in platte tekst wordt opgegeven, zal een poging om «fetch» of «push» uit te voeren resulteren in een fout als de instelling «transfer.credentialsInUrl» de waarde «die» heeft, of een waarschuwing, als de waarde «warn» is ingesteld.
- De nieuwe implementatie van de interactieve modus van het commando «git add -i», herschreven van Perl naar C, is standaard ingeschakeld.
Bron: opennet.ru
