Byl vydán release distribuovaného systému správy zdrojového kódu Git 2.56. Kód Git je distribuován pod licencí GPLv2+. V porovnání s předchozí verzí obsahuje nová verze 748 změn, které byly připraveny za účasti 104 vývojářů, z nichž 39 se poprvé podílelo na vývoji Gitu. Mezi hlavní novinky patří (1, 2, 3):
- Byl přidán režim „git add —resolved“ pro řešení konfliktů při slučování větví, který kontroluje soubory na přítomnost konfliktových značek a v případě, že se ve alespoň jednom souboru nalezne značka, vyhodí chybu, neindeksuje žádný ze souborů a zobrazí seznam souborů, které vyžadují opravu. Na rozdíl od příkazu „git add —update“ se v novém režimu zpracovávají pouze soubory, které jsou ve stavu konfliktu, zatímco změněné soubory nesouvisející s konfliktem jsou ignorovány, což umožňuje bezpečné dokončení slučování větví, i když v pracovním adresáři jsou jiné nedokončené úpravy (příkaz „git add —update“ přidával do indexu všechny dříve sledované změněné soubory v pracovním adresáři).
- Práce s velkými repozitáři byla výrazně zrychlena díky optimalizaci algoritmu vyhledávání posledních společných commitů při slučování větví a porovnávání commitů. Při práci jsou nyní brány v úvahu pouze commity náležící výhradně jedné z větví, což umožňuje zastavit skenování ihned po zjištění všech možných společných předků, aniž by se ztrácel čas dalším procházením historie změn. V jednom z testovaných repozitářů se rychlost vyhledávání v průměru zvedla 20krát a v jiném dosáhlo zrychlení 70krát. Při provádění příkazu „git merge-base —all v4.8 v4.9“ v repozitáři s jádrem Linux se počet kroků procházení snížil ze 167 tisíc na 3,8 tisíce.
- Pro serverové použití byl adaptován režim repack „—path-walk“, který umožňuje vytvářet kompaktnější pack soubory díky seskupení objektů podle jejich cesty v adresářové struktuře (například pro repozitář Fluent UI použití „—path-walk“ umožnilo snížit velikost pack souboru z 558 MB na 164 MB). Nová verze umožňuje použití režimu „—path-walk“ ve spojení s bitovými kartami dosupnosti (reachability bitmap) a delta ostrovy (delta island), které využívají git hostingy pro zrychlení práce a izolaci forků od hlavního repozitáře.
- Odstraněna úzká místa, která vedla k nadměrným výpočtům ve velkých repozitářích: odstraněny zbytečné kontroly stavu souborů při zápisu do reftable; vyloučeno opakované skenování seznamu při každém vložení nového pack-souboru; urychleny operace s reftable, ve kterých se nahromadilo mnoho záznamů o odstranění; optimalizována práce s „git diff“ při zadávání omezení podle cest k souborům. Po provedení optimalizací se práce s reftable při velkém počtu odstranění zrychlila 65krát (z 13 sekund na 0,2 sekundy) a provedení problematického příkazu „git diff“ v repozitáři Chromium s 500 000 prvky v indexu trvalo 0,07 sekundy místo 8 minut.
- Do experimentálního příkazu „git history“, který poskytuje možnosti pro přepisování historie změn, byla přidána operace „git history drop“ pro odstranění vybraného commitu s automatickým připojením jeho potomků k rodičovskému commitu.
- Byl přidán příkaz „git branch --delete-merged ‘origin/*’ ‘topic-*'“ pro bezpečné odstranění skupin lokálních větví, jejichž změny byly již přeneseny do externího repozitáře. Pro filtrování větví a repozitářů je povoleno použití masek. Pro analýzu kandidátů na odstranění, bez skutečného provedení operace, lze použít příznak „--dry-run“.
- Byl přidán příkaz „git refs create|update|delete|rename“, který spojuje nízkolevelové operace pro vytváření, odstraňování, přejmenovávání a aktualizaci odkazů.
- Do příkazu „git bisect run“ byla přidána volba „--reset-when-found=[]“, která automaticky vrací repozitář do stavu před zahájením hledání nebo zachovává aktivní problémový commit, aniž by bylo nutné samostatně spouštět příkaz „git bisect reset“.
- Do příkazu „git replay“ byl přidán příznak „--linearize“ pro použití ploché topologie sloučení, obdobně jako u „git rebase --no-rebase-merges“, ale bez přístupu k pracovnímu stromu.
- V příkazu „git log --follow“ byla implementována sledování přejmenování souborů v nelineární historii změn, například při sloučení podvětví. Cesta k souboru je nyní zaznamenávána samostatně pro každé rodičovské commity, což činí výsledek nezávislým na pořadí procházení historie commitů.
- Byla přidána možnost použití příkazu „git repack -a —filter=blob:limit=1m —drop-filtered“ pro odstranění velkých blob-objektů, které byly na vyžádání (on demand) nahrány z externího repozitáře a nejsou použity v aktuálním indexu. Při dalším přístupu k těmto objektům budou automaticky znovu nahrány.
- Ve příkazu „git log —graph“ bylo realizováno přidání odsazení pro přehledné oddělení nesouvislých commitů v grafech s více nezávislými kořeny.
- Byla zajištěna detekce typických překlepů, jako je zadání „git push origin/main“ místo „git push origin main“ nebo „git branch —set-upstream-to origin main“ místo „git branch —set-upstream-to=origin/main“, a zobrazena nápověda pro správné použití varianty.
Zdroj: opennet.ru
