După două luni de dezvoltare, a fost lansată versiunea 2.39 a sistemului de gestionare distribuită a codurilor sursă Git. Git este unul dintre cele mai populare, fiabile și performante sisteme de control al versiunilor, oferind instrumente flexibile pentru dezvoltarea non-liniară, bazate pe ramificare și fuziune a ramurilor. Pentru a asigura integritatea istoriei și rezistența la modificările «retroactive», se utilizează o funcție implicită de hashing a întregii istorii anterioare în fiecare commit, iar autentificarea prin semnături digitale a dezvoltatorilor este posibilă pentru anumite tag-uri și commits.
Comparativ cu versiunea anterioară, noua versiune include 483 de modificări, realizate cu participarea a 86 de dezvoltatori, dintre care 31 au contribuit pentru prima dată. Principalele noutăți sunt:
- În echipa «git shortlog», destinată pentru afișarea rezumatelor cu statistici din istoricul modificărilor, a fost adăugată opțiunea «—group» pentru gruparea personalizată a commits-urilor pe baza unor câmpuri care nu se limitează la autor sau commit-er. De exemplu, pentru a afișa o listă de dezvoltatori cu informații despre numărul de modificări, inclusiv asistenții menționați în câmpul «Co-authored-by», se poate folosi comanda: git shortlog -ns —group=author —group=trailer:co-authored-by
Ieșirea shortlog-ului poate fi agregată folosind specificatori de formatare, iar opțiunea „—group” permite simplificarea considerabilă a creării rapoartelor complexe și eliminarea necesității de a executa comenzi suplimentare de sortare. De exemplu, pentru a crea un raport cu informații despre câte comitere pentru o anumită versiune au fost efectuate în fiecare lună, se poate specifica: 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 Anterior, pentru a efectua o operațiune similară, era necesară utilizarea utilitarelor sort și uniq: git log v2.38.0.. —date=’format:%Y-%m’ —format=’’ | sort | uniq -c
- Funcționalitatea mecanismului „cruft packs” dedicat ambalării obiectelor inaccesibile, pentru care nu există linkuri în repository (nu sunt referite de ramuri sau etichete), a fost extinsă. Obiectele inaccesibile sunt eliminate de colectorul de gunoi, dar rămân în repository pentru o anumită perioadă înainte de ștergere, pentru a evita stările de concurență. Mecanismul „cruft packs” permite stocarea tuturor obiectelor inaccesibile într-un singur fișier pack, iar datele despre timpul de modificare a fiecărui obiect sunt reflectate într-un tabel separat, păstrat într-un fișier cu extinderea „.mtimes”, pentru a nu se suprapune cu timpul de modificare general.
Timpul în care obiectele inaccesibile rămân în repository înainte de ștergerea efectivă este determinat de opțiunea „—prune=”. Deși întârzierea înainte de ștergere este un mod eficient și practic de a preveni deteriorarea repository-ului din cauza stărilor de concurență, aceasta nu este 100% fiabilă. Pentru a simplifica recuperarea unui repository deteriorat, a fost introdusă în noua versiune opțiunea de a salva obiectele lipsă, pentru care opțiunea „—expire-to” a fost adăugată la comanda „git repack”, permițând specificarea unui fișier pentru crearea unei copii externe a tuturor obiectelor șterse. De exemplu, pentru a salva obiectele inaccesibile care nu s-au schimbat în ultimele 5 minute în fișierul backup.git, se poate utiliza comanda: git repack —cruft —cruft-expiration=5.minutes.ago -d —expire-to=..\/backup.git
- Viteza de executare a operației „git grep —cached” a crescut semnificativ (cu până la 70%) atunci când se caută în zonele în care se aplică clonarea parțială (sparse-checkout) și pentru care există indexuri partiale (sparse index). Anterior, la specificarea opțiunii „—cached”, căutarea se desfășura inițial în indexul obișnuit, iar apoi în cele parțiale, ceea ce ducea la întârzieri semnificative în căutarea în repository-uri mari.
- Executarea pe server verificarea coerenței noilor obiecte înainte de a fi plasate în repository în timpul operației „git push” a fost accelerată. Datorită trecerii la luarea în considerare doar a linkurilor declarate la verificare, în repository-ul de testare cu 7 milioane de linkuri, din care doar 3% au fost acoperite de operația push, optimizările aduse au redus timpul de verificare de 4,5 ori.
- Pentru a proteja împotriva potențialelor overflow-uri întregi în cod, echipa „git apply” limitează acum dimensiunea maximă a patch-urilor procesate. Dacă dimensiunea patch-ului depășește 1 GB, va fi afișată o eroare.
- Pentru a proteja împotriva potențialelor vulnerabilități, au fost făcute modificări pentru a curăța informațiile inutile din anteturile trimise atunci când se folosește modulul h2h3 cu opțiunile GIT_TRACE_CURL=1 sau GIT_CURL_VERBOSE=1 împreună cu HTTP/2.
- Atunci când se efectuează o operațiune de check out cu o ramură care este un link simbolic către o altă ramură, comanda „git symbolic-ref HEAD” va afișa acum numele ramurii țintă, nu numele linkului simbolic.
- A fost adăugat suport pentru argumentul @{-1} în opțiunea „—edit-description” („git branch —edit-description @{-1}”) pentru a edita descrierea ramurii anterioare.
- A fost adăugată comanda „git merge-tree —stdin”, care permite transmiterea unui set de parametri prin fluxul de intrare standard.
- Pe sistemele de fișiere de rețea, handler-ul fsmonitor, care urmărește modificările în FS, este dezactivat implicit.
Sursa: opennet.ro
