După trei luni de dezvoltare, a fost lansată versiunea sistemului distribuit de gestionare a codului sursă Git 2.52. Git se remarcă printr-o performanță ridicată și oferă uneltele necesare pentru dezvoltarea non-liniară, bazate pe ramificare și unire a branch-urilor. Pentru a asigura integritatea istoricului și rezistența la modificări retroactive, se utilizează hashing-ul implicit al întregii istorii anterioare în fiecare commit, precum și semnătura digitală a dezvoltatorilor pentru anumite etichete și commit-uri. Codul Git este distribuit sub licența GPLv2+.
Comparativ cu versiunea anterioară, noua versiune a integrat 637 de modificări, realizate de 94 de dezvoltatori (33 dintre ei participând pentru prima dată la dezvoltarea Git). Principalele noutăți (1, 2, 3):
- A fost adăugată comanda „git last-modified” pentru a afișa o listă a fișierelor dintr-o revizie specificată și commit-urile prin care s-au efectuat cele mai recente modificări în fiecare dintre aceste fișiere. $ git last-modified HEAD b56f6dcd7b4c90192018e848d0810f091d092913 test.h 29330ae4b820147c98e723399e9438c8bee60a8a test1.c 573ad8917beb99dc643b6e7f5c117a294384a575 test2.c
- A fost adăugată comanda „git repo” pentru a efectua acțiuni legate de extragerea informațiilor dintr-un depozit. Au fost propuse două subcomenzi — „git repo info” și „git repo structure”, care afișează informații despre configurația depozitului și detalii despre structura acestuia (de exemplu, se poate afla numărul de referințe și obiecte din depozit). $ git repo info object.format references.format object.format=sha1 references.format=reftable $ git repo structure | Structura depozitului | Valoare | | ——————— | —— | | * Referințe | | | * Număr | 1983 | | * Branch-uri | 4 | | * Etichete | 1125 | | * Remote-uri | 854 | | * Altele | 0 | | | | | * Obiecte accesibile | | | * Număr | 518955 | | * Commit-uri | 77469 | | * Arbori | 188865 | | * Blobs | 251631 | | * Etichete | 990 |
- La comanda „git refs” au fost adăugate trei subcomenzi care unifică operațiunile de bază disparate și suprapuse asupra referințelor (git for-each-ref, git show-ref, git update-ref și git pack-refs):
- „git refs optimize” — optimizarea backend-ului de stocare a referințelor (similar cu „git pack-refs”).
- „git refs list” — afișarea listei tuturor referințelor (similar cu „git for-each-ref” sau „git show-ref”).
- „git refs exists” — verificarea existenței unei referințe (similar cu „git show-ref —exists”).
- Formatul pentru exportul sau importul istoricului de commit-uri a fost extins cu posibilitatea de a lucra cu semnături criptografice, folosind atât identificatori de obiecte pe baza algoritmului SHA-1, cât și pe baza SHA-256. În comanda „git fast-import” a fost implementat suportul pentru procesarea etichetelor semnate, similar cu commit-urile semnate. Au fost adăugate opțiunile „—signed-commits=<mod>” și „—signed-tags=<mod>” pentru a gestiona procesarea commit-urilor și etichetelor semnate în etapa de import (modul poate avea valorile verbatim, warn-verbatim, warn-stri, strip sau abort).
- În comanda „git maintenance” a fost adăugat suportul pentru noua strategie „geometric” („git config set maintenance.strategy geometric”), care permite reducerea timpului de întreținere a marilor monorepo-uri. Comparativ cu strategia anterioară, care folosește o logică similară cu comanda „git gc”, noua strategie evită repackingul tuturor obiectelor și exclude operațiunile excesiv consumatoare de resurse, cum ar fi combinarea tuturor fișierelor pack (atunci când este posibil, combinarea se face pe bucăți și fără curățarea obiectelor șterse).
- A fost adăugată comanda „git sparse-checkout clean” pentru a simplifica restaurarea stării directorului de lucru, prin eliminarea fișierelor care nu corespund noii definiții sparse-checkout, care nu ar trebui să fie prezente în copia locală conform parametrilor curenți sparse-checkout.
- Pentru a elimina complicațiile din cod și a simplifica întreținerea, a fost efectuat un refactoring pentru a reduce utilizarea variabilei globale the_repository.
- Utilizarea filtrelor Bloom, o structură probabilistică pentru verificarea apartenenței la un set, a fost extinsă, permițând o evaluare fals pozitivă a unui element lipsă, dar excluzând omisiunea unui element existent. Filtrele Bloom sunt acum utilizate pentru a accelera căutarea în istoricul modificărilor atunci când se specifică măști în căile fișierelor, de exemplu, „foo/bar/*/baz”.
- Performanța comenzii „git describe” a fost îmbunătățită cu până la 30%, datorită utilizării unei cozi de priorități. În „git remote rename” au fost accelerate operațiile de redenumire a referințelor. În „git ls-files” a fost extinsă utilizarea indexurilor. Lucrul cu comanda „git log -L” a fost semnificativ accelerat, datorită eliminării comparațiilor excesive la trei nivele în timpul procesării fuziunilor de commit-uri. Au fost aduse optimizări în biblioteca xdiff.
- A fost oferită opțiunea opțională de a utiliza implementări în limbajul Rust pentru unele funcții interne, cum ar fi codificarea și decodificarea valorilor întregi de lungime variabilă. În mod implicit, codul Rust nu este utilizat și pentru a fi inclus necesită specificarea opțiunii de construire WITH_RUST. În viitor, se preconizează refacerea unor componente interne semnificative Git în Rust și adăugarea Rust printre dependențele de construcție obligatorii în Git 3.0.
- Lista modificărilor incompatibile a fost actualizată, care va fi aplicată în ramura Git 3.0. În Git 3.0 s-a decis să se schimbe setarea init.defaultBranch implicit la valoarea „main”, ceea ce înseamnă că în repositariile create cu comanda „git init”, ramura implicită va fi denumită „main”, și nu „master”. De asemenea, se remarcă trecerea implicită la identificatorii de obiecte bazate pe algoritmul de hash SHA-256 atunci când se inițiază noi repositarii. Pentru a simplifica portabilitatea între repositarii cu identificatori de obiecte pe bază de hash SHA-1 și SHA-256, a fost oferită posibilitatea de a efectua operațiuni push și pull dintr-un repository folosind un alt algoritm de hash.
Sursa: opennet.ro
