După două luni de dezvoltare, este lansat sistemul distribuit de control al surselor Git 2.51. Git este extrem de productiv și oferă instrumente de dezvoltare neliniare bazate pe ramificare și îmbinare a ramurilor. Pentru a asigura integritatea istoricului și rezistența la modificările retroactive, se utilizează hashing-ul implicit al întregului istoric anterior în fiecare commit, precum și semnături digitale ale tag-urilor și commit-urilor individuale de către dezvoltatori. Codul Git este distribuit sub licența GPLv2+.
Comparativ cu versiunea anterioară, noua versiune include 506 modificări pregătite cu participarea a 91 de dezvoltatori (21 au fost noi în dezvoltarea Git). Principalele inovații (1, 2, 3):
- Performanța comenzilor „git push” și „git fetch” în repozitoriile cu un număr mare de linkuri a fost îmbunătățită. Accelerarea se realizează prin actualizarea linkurilor în modul batch, în care mai multe linkuri sunt procesate simultan într-o singură tranzacție, în loc să se creeze o tranzacție separată pentru actualizarea fiecărui link. Optimizarea a crescut semnificativ viteza backend-ului „reftable”, care acum este înaintea backend-ului „files” în ceea ce privește performanța. De exemplu, într-un repozitoriu de testare cu 10 mii de linkuri, performanța „git fetch” a crescut de 22 de ori atunci când s-a utilizat backend-ul „reftable” și de 1.25 ori atunci când s-a utilizat backend-ul „files”. Pentru „git push”, creșterea a fost de 18, respectiv 1.21 ori.
- Se propune o nouă metodă de împachetare a părților unui repozitoriu care nu sunt legate de urmărirea obiectelor inaccesibile și care nu sunt referențiate de ramuri sau etichete din repozitoriu. Informațiile despre obiectele inaccesibile sunt stocate în fișiere pack separate („cruft packs”), ceea ce a dus la necesitatea reflectării lor în indexuri multi-pack (MIDX) pentru a acoperi obiectele care inițial erau inaccesibile și stocate doar în cruft pack, dar care apoi au devenit accesibile după o validare care le referențiază.
În noua versiune, copii suplimentare ale obiectelor accesibile stocate doar în fișierele CRUT sunt salvate la reîmpachetarea fișierelor pack. Această modificare asigură că setul de fișiere pack utilizat pentru stocarea obiectelor accesibile nu conține obiecte care fac referire la alte obiecte stocate în afara acestui set. Pentru a exclude conținutul inaccesibil al fișierelor CRUT din indexurile multipack (MIDX), este propusă setarea „repack.MIDXMustContainCruft”, care permite reducerea semnificativă a dimensiunii acestor indexuri. Activarea setării în depozitul GitHub a redus dimensiunea indexurilor MIDX cu 38%, a accelerat scrierea în indexurile MIDX cu 35% și a crescut performanța de citire cu 5%.
- Opțiunea „--path-walk” a fost adăugată la comanda „git pack-objects”, permițând o nouă metodă de colectare a informațiilor despre obiecte la reîmpachetarea fișierelor de tip pack. În loc să parcurgă obiectele în ordinea reviziei, modul „--path-walk” parcurge obiectele după căile de fișier, permițând împachetarea simultană a tuturor obiectelor cu aceeași cale de fișier. Această abordare elimină euristica care folosește hashing-ul pentru a determina relația dintre un obiect și calea sa de fișier și elimină necesitatea sortării obiectelor înainte de împachetare. Modul „--path-walk” produce fișiere de tip pack semnificativ mai mici decât atunci când se grupează obiecte folosind hash-uri.
- Este definit un format pentru schimbul de stări ale arborelui de lucru și ale indexului stocate într-un depozit creat cu comanda git stash. Noul format codifică modificările stocate ca o secvență de commit-uri. Sunt furnizate subcomenzile git stash import și export, care pot fi utilizate pentru a transfera stările stocate de la un sistem la altul și a le transmite sau extrage ca și cum ar fi ramuri sau etichete obișnuite. git stash export --to-ref refs/stashes/my-stash git push origin refs/stashes/my-stash … git fetch origin '+refs/stashes/*:refs/stashes/*' git stash import refs/stashes/my-stash
- Comanda „git cat-file”, care afișează conținutul obiectelor specificate, afișează acum informații despre obiectele lipsă (de exemplu, din cauza coruperii repozitoriului) și submodulele atunci când se utilizează opțiunile „--batch” și „--batch-check”. Anterior, la specificarea unei căi către un submodul, comanda „git cat-file --batch-check” afișa „missing”, dar acum va afișa identificatorul obiectului.
- Comanda „git log” folosește optimizările filtrului Bloom pentru a accelera căutările în istoric atunci când se specifică filtre cu căi multiple de fișiere, cum ar fi „git log - cale/către/a cale/către/b”.
- Comenzile „git switch” și „git restore”, considerate experimentale încă din 2019, au fost stabilizate. Comenzile sunt prezentate ca echivalente moderne ale comenzii „git checkout”, separând capabilitățile vag legate de acea comandă, cum ar fi manipularea ramurilor (comutarea și crearea) și restaurarea fișierelor din directorul de lucru.
- Comanda „git whatchanged”, echivalentă cu „git log --raw”, a fost depreciată și programată pentru eliminare în ramura Git 3.0.
- Comanda git for-each-ref are acum o opțiune „--start-after” care poate fi utilizată împreună cu opțiunea „--count” pentru a oferi ieșire paginată.
- Comenzile „git merge” și „git pull” au acum opțiunea „--compact-summary” pentru a utiliza formatul compact de rezumat în loc de formatul diffstat.
- Baza de cod Git permite utilizarea cuvântului cheie „bool”, introdus în standardul C99. Unele caracteristici C99 care sunt utilizate experimental în Git sunt, de asemenea, documentate (de exemplu, „(struct foo){ .member = value };” este planificat să fie permis la mijlocul anului 2026). Un compilator care să suporte C99 este obligatoriu pentru Git începând cu 2021, dar caracteristicile C99 sunt implementate cu mare atenție pentru a menține compatibilitatea cu compilatoarele care suportă doar parțial standardul.
- Regulile de trimitere a patch-urilor au fost actualizate pentru a permite trimiterea de patch-uri sub un pseudonim, în loc să folosească doar numele real al dezvoltatorului. Această modificare este în concordanță cu regulile de trimitere a patch-urilor pentru kernel. Linux.
- Lista modificărilor importante care vor fi aplicate în ramura Git 3.0 a fost actualizată. Printre modificările notabile din viitoarea versiune Git 3.0 se numără utilizarea implicită a identificatorilor de obiect bazați pe SHA-256 la inițializarea noilor repozitorii și utilizarea formatului „reftable” pentru stocarea referințelor la ramuri și etichete într-un repozitoriu (folosind stocarea în blocuri din proiectul JGit, optimizată pentru stocarea unui număr foarte mare de referințe).
Sursa: opennet.ru
