Bol release distribuovaného systému správy zdrojových kódov Git 2.56. Kód Git je distribuovaný pod licenciou GPLv2+. V porovnaní s predchádzajúcim vydaním sa do novej verzie prijalo 748 zmien, na ktorých pracovalo 104 vývojárov, z ktorých 39 sa prvýkrát zapojilo do vývoja Git. Hlavné novinky (1, 2, 3):
- Pridaný režim „git add —resolved“ na riešenie konfliktov pri zlúčení vetiev, ktorý kontroluje súbory na prítomnosť značiek konfliktu a v prípade zistenia akejkoľvek značky v aspoň jednom súbore vydá chybu, nezindexuje žiadny z súborov a zobrazuje zoznam súborov vyžadujúcich opravu. Na rozdiel od príkazu „git add —update“ v novom režime sa spracovávajú iba súbory nachádzajúce sa v stave konfliktu, zatiaľ čo nie všetky modifikované súbory súvisiace s konfliktom sú ignorované, čo umožňuje bezpečne dokončiť zlúčenie vetiev, aj keď v pracovnom adresári sú iné nezakompletované úpravy (príkaz „git add —update“ pridával do indexu všetky predtým sledované modifikované súbory v pracovnom adresári).
- Výrazne sa zrýchlila práca s veľkými repozitármi optimalizáciou algoritmu vyhľadávania posledných spoločných commitov pri zlúčení vetiev a porovnávaní commitov. V procese práce sa teraz zohľadňujú commit, ktoré patria výlučne jednej z vetiev, čo umožňuje zastaviť skenovanie okamžite po zistení všetkých možných spoločných predkov, bez plytvania časom na ďalšie prechádzanie históriou zmien. V jednom z testovaných repozitárov sa rýchlosť vyhľadávania zvýšila v priemere 20-krát, zatiaľ čo v inom zrýchlenie dosiahlo 70-krát. Pri vykonávaní príkazu „git merge-base —all v4.8 v4.9“ v repozitári s jadrom Linux sa počet krokov obchodu znížil zo 167 tisíc na 3.8 tisíc.
- Pre serverové použitie bol prispôsobený režim repackovania „—path-walk“, ktorý umožňuje vytvárať kompaktnejšie pack súbory skupinovaním objektov podľa ich cesty v stromovej štruktúre (napríklad pre repozitár Fluent UI použitie „—path-walk“ umožnilo znížiť veľkosť pack súboru z 558 MB na 164 MB). V novej verzii bola implementovaná možnosť používania režimu „—path-walk“ spolu s bitovými mapami dosiahnuteľnosti (reachability bitmap) a delta ostrovmi (delta island), ktoré používajú git hostingy na zrýchlenie práce a izoláciu forkov od hlavného repozitára.
- Odstránili sme úzke miesta, ktoré viedli k nadmerným výpočtom vo veľkých repozitároch: odstránili sme zbytočné kontroly stavu súborov pri zápise do reftable; eliminovali sme opakované skenovanie zoznamu pri každom vložení nového pack-súboru; urýchlili sme operácie s reftable, v ktorých sa nahromadilo veľa záznamov o odstránení; optimalizovali sme prácu „git diff“ pri stanovení obmedzení podľa súborových ciest. Po zavedení optimalizácií sa práca s reftable pri veľkom počte odstránení urýchlila 65-krát (z 13 sekúnd na 0.2 sekundy) a vykonanie problémového príkazu „git diff“ v repozitári Chromium s 500000 prvkami v indexe sa skrátilo na 0.07 sekundy namiesto 8 minút.
- Do experimentálneho príkazu „git history“, ktorý poskytuje možnosti pre prepisovanie histórie zmien, bola pridaná operácia „git history drop“ na odstránenie vybraného commitu s automatickým pripojením jeho potomkov k rodičovskému commitu.
- Pridaný príkaz „git branch —delete-merged ‘origin/*’ ‘topic-*'“ na bezpečné odstraňovanie skupín lokálnych vetiev, ktorých zmeny už boli odovzdané do externého repozitára. Pre filtrovanie vetiev a repozitárov je povolené používanie mask. Na analýzu kandidatov na odstránenie, bez skutočného vykonania operácie, je možné použiť prepínač „—dry-run“.
- Pridaný príkaz „git refs create|update|delete|rename“, ktorý kombinuje nízkoúrovňové operácie na vytváranie, odstraňovanie, premenovávanie a aktualizáciu odkazov.
- Do príkazu „git bisect run“ bola pridaná možnosť „—reset-when-found=[]“, ktorá automaticky vracia repozitár do stavu pred začiatkom vyhľadávania alebo ponecháva aktívny problémový commit bez potreby samostatného spustenia príkazu „git bisect reset“.
- Do príkazu „git replay“ bol pridaný prepínač „—linearize“ na použitie ploché topológie zlúčenia, podobne ako „git rebase —no-rebase-merges“, ale bez odkazovania na pracovné strom.
- V príkaze „git log —follow“ bola implementovaná sledovanie premenovania súborov v nekonvenčnej histórii zmien, napríklad pri zlúčení podvetiev. Cesta k súboru je teraz zaznamenaná samostatne pre každý rodičovský commit, čo robí výsledok nezávislým od poradia prechádzania históriou commitov.
- Pridaná funkcia príkazu „git repack -a —filter=blob:limit=1m —drop-filtered“ na odstránenie veľkých blob-objektov, ktoré boli načítané na požiadanie z externého repozitára a nie sú používané v aktuálnom indexe. Pri neskoršom prístupe k týmto objektom budú automaticky znovu načítané.
- V príkaze „git log —graph“ bola pre grafy s viacerými nezávislými koreňmi implementovaná možnosť pridania odsadení na prehľadné oddelenie nesúvisiacich commitov.
- Zabezpečené odhaľovanie typických preklepov, ako je uvedenie „git push origin/main“ namiesto „git push origin main“ alebo „git branch —set-upstream-to origin main“ namiesto „git branch —set-upstream-to=origin/main“, a poskytnutie poradenstva k správnemu variantu.
Zdroj: opennet.ru
