Lansarea sistemului de gestionare a codului sursă Git 2.51

După două luni de dezvoltare, este lansată versiunea 2.51 a sistemului distribuit de gestionare a codului sursă Git. Git se distinge prin performanța sa ridicată și oferă instrumente pentru dezvoltarea non-liniară, bazate pe ramificare și unire a ramurilor. Pentru a asigura integritatea istoricului și rezistența la modificări retroactive, se utilizează hashingul implicit al întregului istoric anterior în fiecare commit, precum și certificarea digitală prin semnături ale dezvoltatorilor pentru anumite etichete și commit-uri. Codul Git este distribuit sub licența GPLv2+.

Comparativ cu versiunea anterioară, în noua versiune au fost acceptate 506 modificări, pregătite cu participarea a 91 de dezvoltatori (21 au participat pentru prima dată la dezvoltarea Git). Principalele noutăți (1, 2, 3):

  • Performanța comenzilor „git push” și „git fetch” a fost îmbunătățită în repozitoarele cu un număr mare de referințe. Accelerația a fost asigurată prin actualizarea referințelor în mod batch, în care mai multe referințe sunt procesate într-o singură tranzacție, în loc de a crea o tranzacție separată pentru actualizarea fiecărei referințe. Optimizarea a crescut semnificativ viteza backend-ului „reftable”, care acum depășește în performanță backend-ul „files”. De exemplu, în repozitorul de testare cu 10.000 de referințe, performanța „git fetch” utilizând backend-ul „reftable” a crescut de 22 de ori, iar utilizând backend-ul „files” de 1.25 ori. Pentru „git push”, creșterea a fost de 18 și respectiv 1.21.
  • A fost propusă o nouă metodă de ambalare în fișierele pack a părților repozitorului care nu sunt legate de obiecte inaccesibile, pentru care în repozitoriu nu există referințe (nu sunt legate ramuri sau etichete). Informațiile despre obiectele inaccesibile sunt stocate în fișiere pack separate („cruft packs”), ceea ce a determinat necesitatea reflectării lor în indecșii multi-pack MIDX (multi-pack index) pentru a acoperi obiectele care inițial erau inaccesibile și erau stocate doar în cruft-pack, dar apoi au devenit accesibile după commit-ul care se referă la ele.

    În noua versiune, la reambalarea fișierelor pack, s-a asigurat păstrarea copiei suplimentare a obiectelor accesibile, stocate doar în fișierele cruft. Această modificare garantează că în setul de fișiere pack, utilizat pentru stocarea obiectelor accesibile, nu există obiecte care fac trimitere la alte obiecte stocate în afara acestui set. Pentru excluderea conținutului inaccesibil al fișierelor cruft din indexurile multipack (MIDX), a fost propusă setarea „repack.MIDXMustContainCruft”, care permite reducerea semnificativă a mărimii acestor indexuri. Activarea setării în depozitul GitHub a dus la o reducere a dimensiunii indexurilor MIDX cu 38%, la accelerarea scrierii în indexurile MIDX cu 35% și la îmbunătățirea performanței de citire cu 5%.

  • Comanda „git pack-objects” a fost îmbogățită cu opțiunea „—path-walk”, care introduce o nouă metodă de colectare a informațiilor despre obiecte în timpul reambalării fișierelor pack. În loc să parcurgă obiectele în ordinea reviziilor, în modul „—path-walk”, obiectele sunt parcurse printr-o traversare a căilor fișierelor, permițându-se împachetarea simultană a tuturor obiectelor cu aceeași cale de fișier. Această abordare oferă posibilitatea de a exclude euristica care utilizează hashing pentru a determina legătura unui obiect cu calea sa de fișier, precum și eliminarea sortării obiectelor înainte de împachetare. Atunci când se utilizează modul „—path-walk”, dimensiunea fișierelor pack generate este semnificativ mai mică decât în cazul grupării obiectelor prin hashing.
  • A fost definit un format pentru schimbul stărilor salvate ale arborelui de lucru și indexurilor în depozit, create prin comanda „git stash”. Noul format permite codificarea modificărilor salvate (înregistrările stash) sub formă de secvență de commituri. Pentru import și export sunt propuse subcomenzile „git stash import” și „git stash export”, care pot fi utilizate pentru a transfera stările salvate de pe un sistem pe altul și pentru a efectua operații de push sau pull cu aceste stări ca și cum ar fi ramuri sau tag-uri 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
  • În comanda „git cat-file”, care extrage conținutul obiectelor date, au fost implementate opțiunile „—batch” și „—batch-check” pentru a permite afișarea informațiilor despre obiectele lipsă (de exemplu, din cauza deteriorării repository-ului) și submodule. În trecut, la specificarea unei căi către un submodul, comanda „git cat-file —batch-check” afișa „missing”, dar acum va arăta identificatorul obiectului.
  • În comanda „git log” au fost implementate optimizări bazate pe filtre Bloom pentru a accelera căutarea în istoricul modificărilor atunci când sunt specificate filtre cu mai multe căi de fișiere, de exemplu, „git log — path/to/a path/to/b”.
  • Comenzile „git switch” și „git restore” au fost stabilizate, fiind considerate experimentale încă din 2019. Aceste comenzi sunt prezentate ca echivalente moderne ale „git checkout”, separând funcționalitățile slab legate ale acestei comenzi, cum ar fi manipularea ramurilor (schimbarea și crearea) și restaurarea fișierelor din directorul de lucru.
  • Comanda „git whatchanged”, echivalentă cu „git log —raw”, a fost declarată învechită și este programată pentru eliminare în ramura Git 3.0.
  • Comanda „git for-each-ref” a fost extinsă cu opțiunea „—start-after”, care poate fi utilizată împreună cu opțiunea „—count” pentru a organiza ieșirea paginată.
  • În comenzile „git merge” și „git pull” a fost adăugată opțiunea „—compact-summary” pentru a utiliza un format compact pentru rezumatul modificărilor, în locul formatului diffstat.
  • În baza de cod Git a fost permisă utilizarea cuvântului cheie „bool”, care a fost introdus în standardul C99. De asemenea, au fost documentate unele funcționalități din C99 care sunt utilizate experimental în Git (de exemplu, se plănuiește ca, în mijlocul anului 2026, să fie permisă utilizarea construcțiilor „(struct foo){ .member = value };”). Compilerul cu suport pentru C99 este obligatoriu pentru Git din 2021, dar caracteristicile specificației C99 sunt introduse foarte cu grijă pentru a menține compatibilitatea cu compilatoarele care susțin parțial acest standard.
  • Regulile pentru primirea patch-urilor au fost modificate pentru a permite trimiterea patch-urilor sub un pseudonim, nu doar sub numele real al dezvoltatorului. Această modificare este în conformitate cu regulile pentru primirea patch-urilor în nucleul Linux.
  • Lista modificărilor incompatibile a fost actualizată, modificări ce vor fi aplicate în ramura Git 3.0. Schimbări semnificative în viitoarea versiune Git 3.0 includ trecerea implicită la identificatorii de obiecte pe baza algoritmului de hash SHA-256 la inițializarea de noi repozitorii și utilizarea formatului „reftable” pentru stocarea referințelor la ramuri și etichete în repozitoriu (folosind stocarea de tip bloc din proiectul JGit, optimizată pentru stocarea unui număr foarte mare de referințe).

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster