A fost lansată versiunea sistemului de gestionare distribuită a codului sursă Git 2.56. Codul Git este distribuit sub licența GPLv2+. Comparativ cu versiunea precedentă, noua versiune include 748 de schimbări, realizate cu participarea a 104 dezvoltatori, dintre care 39 au participat pentru prima dată la dezvoltarea Git. Principalele noutăți (1, 2, 3):
- A fost adăugat modul „git add —resolved” pentru rezolvarea conflictelor la îmbinarea ramurilor, care verifică fișierele pentru prezența markerilor de conflict și, la găsirea unui marker în cel puțin un fișier, generează o eroare, nu indexează niciunul dintre fișiere și arată lista fișierelor care necesită corectare. Spre deosebire de comanda „git add —update”, în noul mod sunt procesate doar fișierele aflate în stare de conflict, iar fișierele modificate care nu sunt legate de conflict sunt ignorate, ceea ce permite finalizarea în siguranță a îmbinărilor ramurilor, chiar dacă în catalogul de lucru există alte modificări nefinalizate (comanda „git add —update” adăuga în index toate fișierele modificate, care fuseseră urmărite anterior în catalogul de lucru).
- S-a accelerat semnificativ lucrul cu repozitorii mari, datorită optimizării algoritmului de căutare a celor mai recente comite comune la îmbinarea ramurilor și compararea comitelor. În timpul procesului de lucru, acum sunt considerate comitele care aparțin exclusiv uneia dintre ramuri, ceea ce permite oprirea scanării imediat după descoperirea tuturor posibilelor strămoșe comune, fără a pierde timp cu parcurgerea ulterioară a istoricului modificărilor. În unul dintre repozitoriile testate, viteza de căutare a crescut în medie de 20 de ori, iar în altul, accelerarea a atins 70 de ori. La executarea comenzii „git merge-base —all v4.8 v4.9” în repozitoriul cu kernel Linux, numărul pașilor de parcurs a fost redus de la 167 de mii la 3.8 mii.
- Pentru utilizarea pe server, modul de recompresie „—path-walk” a fost adaptat, permițând crearea unor pack-file-uri mai compacte prin gruparea obiectelor în funcție de calea lor în arborele de directoare (de exemplu, pentru repozitorul Fluent UI, utilizarea „—path-walk” a redus dimensiunea pack-file-ului de la 558 MB la 164 MB). În noua versiune a fost implementată posibilitatea de a utiliza modul „—path-walk” împreună cu hărțile bitmap de accesibilitate (reachability bitmap) și insulele delta (delta island), utilizate de git-hosting-uri pentru accelerarea lucrului și izolarea fork-urilor de repozitoriul principal.
- S-au eliminat blocajele care duceau la calcule excesive în repositoare mari: verficările inutile ale stării fișierelor la scrierea în reftable au fost îndepărtate; s-a exclus scanarea repetată a listei la fiecare inserare a unui nou fișier pack; operațiunile cu reftable, în care s-au acumulat multe înregistrări despre ștergeri, au fost accelerate; funcționarea comenzii „git diff” a fost optimizată atunci când s-au specificat restricții pe căile fișierelor. După optimizări, lucrul cu reftable în cazul unui număr mare de ștergeri s-a accelerat de 65 de ori (de la 13 secunde la 0,2 secunde), iar executarea comenzii problematice „git diff” în repositoul Chromium cu 500000 de elemente în index a început să dureze 0,07 secunde în loc de 8 minute.
- Echipei experimentale „git history”, care oferă posibilități de rescriere a istoricului modificărilor, i s-a adăugat operația „git history drop” pentru a șterge un commit selectat cu atașarea automată a descendenților săi la commitul părinte.
- A fost adăugată comanda „git branch —delete-merged ‘origin *’ ‘topic-*'” pentru ștergerea în siguranță a grupurilor de ramuri locale, al căror conținut a fost deja trimis în repositoare externe. Se permite utilizarea mastcilor pentru filtrarea ramurilor și repositoarelor. Pentru a analiza candidații pentru ștergere, fără a efectua efectiv operația, se poate folosi opțiunea „—dry-run”.
- A fost adăugată comanda „git refs create|update|delete|rename”, care reunește operațiile de bază pentru crearea, ștergerea, redenumirea și actualizarea linkurilor.
- Comenzii „git bisect run” i s-a adăugat opțiunea „—reset-when-found=[]”, care restabilește automat repositoul în starea de dinainte de începerea căutării sau lasă activ commitul problematic, fără necesitatea de a rula separat comanda „git bisect reset”.
- Comenzii „git replay” i s-a adăugat flag-ul „—linearize” pentru utilizarea unei topologii plate de fuziune, similar cu „git rebase —no-rebase-merges”, dar fără a apela la arborele de lucru.
- În comanda „git log —follow” a fost implementată urmărirea redenumirilor fișierelor în istoria nelineară a modificărilor, de exemplu, în timpul fuziunii subramurilor. Calea fișierului este acum fixată separat pentru fiecare commit părinte, ceea ce face rezultatul independent de ordinea parcurgerii istoricului commiturilor.
- A fost adăugată posibilitatea de a utiliza comanda „git repack -a —filter=blob:limit=1m —drop-filtered” pentru a elimina obiectele blob mari, încărcate la cerere dintr-un repository extern și care nu sunt utilizate în indexul curent. Atunci când aceste obiecte sunt accesate ulterior, acestea vor fi reîncărcate automat.
- În comanda „git log —graph” pentru grafuri cu mai multe rădăcini independente, s-a implementat adăugarea de indentări pentru a separa vizibil commit-urile necorelate.
- S-a asigurat identificarea greșelilor tipice de tipar, cum ar fi specificarea „git push origin/main” în loc de „git push origin main” sau „git branch —set-upstream-to origin main” în loc de „git branch —set-upstream-to=origin/main”, și afișarea unui mesaj de sugestie pentru utilizarea variantei corecte.
Sursa: opennet.ro
