Byl vydán nový release distribuovaného systému pro správu textových souborů Git 2.55. Mezi klíčovými změnami: výchozí zahrnutí sestavení s Rustem, implementace procesu fsmonitor pro Linux, nová strategie repackování inkrementálního MIDX-indexu, příkaz „git history fixup“ pro opravu commitu, optimalizace generování bitmap dostupnosti objektů, podpora paralelního provádění hooků, příkaz „git format-rev“. Kód Git je distribuován pod licencí GPLv2+.
Ve srovnání s minulou verzí byla do nové verze přijata 505 změn, které připravilo 100 vývojářů, z nichž 33 se poprvé podílelo na vývoji Gitu. Hlavní novinky (1, 2, 3):
- Podpora komponent napsaných v jazyce Rust je ve výchozím nastavení zahrnuta. Kompilátor rustc
byl přidán mezi závislosti pro sestavení. Pro sestavení bez Rustu lze při spuštění utility make použít příznak „NO_RUST=1“ nebo „-Drust=disabled“ při vykonávání „meson configure“. Možnost vypnout sestavení s Rustem bude podporována až do verze Git 3.0, ve které bude Rust zahrnut mezi povinné závislosti. V jazyce Rust byla implementována vrstva pro přenositelnost mezi konfiguracemi s hashovacími funkcemi SHA-1 a SHA-256, stejně jako některé vnitřní funkce, jako je kódování a dekódování celočíselných hodnot proměnné délky. V budoucnu se očekává přepracování významnějších vnitřních komponent Gitu na Rust. - Do experimentálního příkazu „git history“, který poskytuje funkce pro přepisování historie změn, byla přidána operace „git history fixup“ pro opravu commitů. Operace „fixup“ umožňuje přesunout změny přidané pomocí „git add“ do dřívějšího commitu a automaticky přepsat všechny následující commity analogicky k vykonání příkazu „git commit —fixup=<commit>“ a spuštění „git rebase —autosquash <commit>~“.
- Pro platformu Linux byl implementován pozadní proces fsmonitor, který sleduje změny v souborovém systému pomocí mechanismu inotify a umožňuje vyhnout se procházení celého pracovního adresáře při vykonávání příkazů jako „git status“. Aktivace se provádí prostřednictvím nastavení „core.fsmonitor“.
- Do týmu „git repack“ byl přidán režim „—write-midx=incremental“, který implementuje novou strategii aktualizace metadat v inkrementálním MIDX indexu (multi-pack index), což umožňuje obejít se bez přeupakovávání celého indexu. V inkrementálním multisouborovém indexu místo jednoho velkého indexu, který obsahuje informace o rozložení objektů v pack souborech, se používá dělení na vrstvy — každá vrstva pokrývá určitý počet pack souborů a je uchovávána v samostatném bitmapovém souboru. Taková struktura umožňuje přidávat do indexu data o objektech v nových pack souborech, připojujíce k indexu nové vrstvy bez přestavování již existujících vrstev.
Příkaz „git repack —write-midx=incremental“ umožňuje přidat do inkrementálního MIDX indexu novou vrstvu, která pokrývá nedávno vytvořené pack soubory. V kombinaci s režimem balení repozitářů „—geometric“ nová příkaz poskytuje možnost sloučit nové objekty z několika pack souborů do jednoho většího pack souboru a při potřebě provést balení a sloučení několika sousedních vrstev inkrementálního MIDX indexu. Taková strategie při provádění „git repack“ přepisuje pouze horní vrstvy, zatímco nechává staré velké vrstvy nedotčené a také vylučuje nekontrolovatelné rozrůstání řetězce vrstev, čímž udržuje celkový počet vrstev na úrovni úměrné logaritmu celkového počtu objektů.
- Generace bitmap dostupnosti objektů byla značně optimalizována díky novému algoritmu pro procházení stromu objektů, který vylučuje nadbytečnou rekurzi, caching pozic objektů, třídění bitmap před jejich sloučením operací XOR a předělání kódu pro vytváření bitmap pseudo-sloučení (pseudo-merge). V testovacím repozitáři optimalizace umožnily zkrátit čas generování bitmap z 612 na 294 sekund.
- Byla zavedena možnost paralelního provádění nezávislých hooků v konfiguračních souborech. Hooky, které ovlivňují sdílený stav nebo ho zohledňují, například měnící poznámky k commitům nebo inspektořící indexy a pracovní adresář, nemohou být spouštěny paralelně. Přitom je však možné paralelně spouštět hooky pro kontrolu linterem a provádění unit testování. Hooky umožňující paralelní provádění se nastavují prostřednictvím parametru „hook. název_huoku.parallel = true“. Počet současně spouštěných úloh se určuje pomocí nastavení hook.jobs, hook..jobs nebo volby příkazového řádku „-j“.
- V příkazu „git pack-objects —path-walk“ byla zavedena možnost specifikovat filtry, jako například „blob:none“, „blob:limit=“, „tree:0“, „object:type=“, „sparse:“ a „combine:“. Test prokázal, že vyloučení blobů při provádění „—path-walk“ umožnilo zkrátit velikost vytvořeného pack souboru o 16%.
- Byl přidán příkaz „git format-rev“ pro formátování revizí a názvů objektů, které jsou uvedeny v seznamech commitů nebo se vyskytují v libovolném textu (například může být použit v hooku pro zpracování poznámek k commitům).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Bylo ve výchozím nastavení povoleno únik většiny sekvencí řízení terminálu v informačních zprávách a chybových textech, které jsou předávány serverem. Při přístupu k malwaru serveru takové escape sekvence mohly být použity k skrytí nebo modifikaci výstupu, například pomocí escape sekvencí pro přesun kurzoru a čištění textu. Podpora escape sekvencí pro zvýrazňování prvků barvou zůstává zachována.
- Příkaz „git checkout -m“ nyní automaticky ukládá konfliktní místní změny do stash oblasti bez nutnosti okamžitého řešení konfliktu.
- Do příkazu „git push“ byla přidána možnost umístění větve na několik externích Git serverů jedním příkazem. Například pro přenos větve main nejen na hlavní server, ale i na zrcadla, lze vytvořit skupinu „publish“ z servery „github“, „gitlab“ a „mirror“:
git config remotes.publish „github gitlab mirror“
git push publish main - Do příkazu „git log —graph“ byla přidána možnost „—graph-lane-limit=<N>“ pro omezení počtu vertikálních pruhů při vizualizaci větví, což umožňuje nechat místo na obrazovce pro data o commitech v repozitářích s velkým počtem větví.
…
* | | | | 619931f561 Sloučení větve ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: zjednodušit porovnání GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h: vyčistit GIT_GNUC_PREREQ() a UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filtrovat pathspec před lstat - Do příkazů „git log“ a „git rev-list“ byla přidána možnost „—max-count-oldest=<N>, která umožňuje vybrat N nejstarších commitů v rozsahu.
Zdroj: opennet.ru
