Po dvou měsících vývoje byla zveřejněna verze rozděleného systému správy zdrojového kódu Git 2.39. Git je jedním z nejpopulárnějších, nejspolehlivějších a vysoce výkonných systémů pro správu verzí, který poskytuje flexibilní nástroje pro nelineární vývoj založené na větvení a slučování. Pro zajištění integrity historie a odolnosti vůči „zpětným změnám“ se používá implicitní hashování celé předchozí historie v každém commitu, rovněž je možné ověřování digitálními podpisy vývojářů jednotlivých tagů a commitů.
Ve srovnání s předchozí verzí byla do nové verze přijata 483 změn, které připravilo 86 vývojářů, z nichž 31 se zúčastnilo vývoje poprvé. Mezi hlavní novinky patří:
- Do příkazu „git shortlog“, určeného pro zobrazení souhrnů se statistikou z historie změn, byla přidána volba „—group“ pro libovolné seskupení commitů podle polí, které nejsou omezeny na autora nebo committera. Například pro zobrazení seznamu vývojářů s informací o počtu změn, které zahrnují asistenty zmíněné v poli „Co-authored-by“, lze použít příkaz: git shortlog -ns —group=author —group=trailer:co-authored-by
Výstup shortlogu lze agregovat pomocí formátovacích specikátorů a volba „—group“ umožňuje zásadně zjednodušit vytváření složitých zpráv a vyhnout se provádění dalších třídicích příkazů. Například pro vytvoření zprávy s informacemi o tom, kolik commitů pro danou verzi bylo přijato v každém měsíci, lze zadat: git shortlog v2.38.0.. —date=’format:%Y-%m’ —group=’’ -s 2 2022-08 47 2022-09 405 2022-10 194 2022-11 5 2022-12. Dříve by pro provedení podobné operace bylo nutné přitáhnout utility sort a uniq: git log v2.38.0.. —date=’format:%Y-%m’ —format=’’ | sort | uniq -c
- Byly rozšířeny možnosti mechanismu „cruft packs“, který slouží k balení nedosažitelných objektů, na které v repozitáři chybí odkazy (netýkají se větve nebo tagy). Nedosažitelné objekty jsou odstraňovány správcem odpadků, ale před odstraněním zůstávají v repozitáři nějakou dobu, aby se předešlo podmínkám závodu. Mechanismus „cruft packs“ umožňuje uložit všechny nedosažitelné objekty do jednoho pack souboru a údaje o čase modifikace každého objektu odrážet v samostatné tabulce, která je uložena v samostatném souboru s příponou „.mtimes“, aby nedocházelo ke kolizím s obecním časem úprav.
Doba, po kterou jsou nedosažitelné objekty v repozitáři před jejich skutečným odstraněním, je určena volbou „—prune=<date>“. I když je zpoždění před odstraněním dostatečně efektivním a praktickým způsobem, jak zabránit poškození repozitáře v důsledku podmínky závodu, není to na 100% spolehlivé. Aby se usnadnilo obnovení poškozeného repozitáře, byla v nové verzi poskytnuta možnost uchování chybějících objektů, k čemuž byla do příkazu „git repack“ přidána volba „—expire-to“, která umožňuje určit soubor pro vytvoření externí kopie všech odstraňovaných objektů. Například pro uložení do souboru backup.git nedosažitelných objektů, které se nezměnily za posledních 5 minut, lze použít tento příkaz: git repack —cruft —cruft-expiration=5.minutes.ago -d —expire-to=..\/backup.git
- Rychlost provádění operace „git grep —cached“ byla výrazně zvýšena (až o 70%) při hledání v oblastech, kde se používá částečné klonování (sparse-checkout) a pro které jsou k dispozici částečné indexy (sparse index). Dříve se při zadání volby „—cached“ nejprve provádělo hledání v běžném indexu a poté v částečných, což vedlo k významným zpožděním při hledání ve velkých repozitářích.
- Bylo urychleno provádění na serveru kontrolách konzistence nových objektů před jejich umístěním do repozitáře při provádění operace „git push“. Přechodem na zohlednění pouze deklarovaných odkazů, v testovacím repozitáři s 7 miliony odkazů, z nichž 3 % podléhá operaci push, umožnily provedené optimalizace zkrátit čas kontroly 4,5krát.
- Pro ochranu před potenciálními přetečeními celých čísel v kódu je v příkazu „git apply“ omezen maximální velikost zpracovávaných patchů. Pokud velikost patchu překročí 1 GB, nyní bude vyhozena chyba.
- Pro ochranu před potenciálními zranitelnostmi došlo ke změnám pro čištění nadbytečných informací v hlavičkách, které jsou vystaveny při použití modulu h2h3 s možnostmi GIT_TRACE_CURL=1 nebo GIT_CURL_VERBOSE=1 spolu s HTTP/2.
- Při provádění operace check out s větví, která je symbolickým odkazem na jinou větev, nyní příkaz „git symbolic-ref HEAD“ vypíše název cílové větve, nikoli název symbolického odkazu.
- Byla přidána podpora argumentu @{-1} v možnosti „—edit-description“ („git branch —edit-description @{-1}“) pro úpravu popisu předchozí větve.
- Byl přidán příkaz „git merge-tree —stdin“, který umožňuje předat seznam parametrů prostřednictvím standardního vstupu.
- Na síťových souborových systémech je standardně vypnut obslužný program fsmonitor, který sleduje změny v FS.
Zdroj: opennet.ru
