A fost lansată versiunea sistemului distribuit de gestionare a codului sursă Git 2.55. Printre principalele modificări se numără: activarea implicită a construcției cu Rust, implementarea procesului fsmonitor pentru Linux, o nouă strategie de reorganizare a indexului MIDX incremental, comanda „git history fixup” pentru corectarea unui commit, optimizarea generării hărților de accesibilitate a obiectelor, suport pentru execuția paralelă a hook-urilor, comanda „git format-rev”. Codul Git este distribuit sub licența GPLv2+.
Comparativ cu versiunea precedentă, noua versiune include 505 modificări, pregătite cu participarea a 100 de dezvoltatori, dintre care 33 au participat pentru prima dată la dezvoltarea Git. Principalele noutăți (1, 2, 3):
- Suportul pentru componente scrise în Rust este activat în mod implicit. Compilatorul rustc
a fost adăugat la dependențele de construcție. Pentru a construi fără Rust, se poate folosi flag-ul „NO_RUST=1” la executarea utilitarului make sau „-Drust=disabled” la rularea „meson configure”. Posibilitatea de a dezactiva construcția cu Rust va fi suportată până la ramura Git 3.0, în care Rust va deveni una dintre dependențele obligatorii. O interfață scrisă în Rust a fost implementată pentru portabilitatea între configurațiile cu hash-uri SHA-1 și SHA-256, precum și unele funcții interne, cum ar fi codificarea și decodificarea valorilor întregi de lungime variabilă. Se așteaptă ca în viitor compoente interne semnificative ale Git să fie refăcute în Rust. - În echipa experimentală „git history”, care oferă funcționalități pentru rescrierea istoricului modificărilor, a fost adăugată operațiunea „git history fixup” pentru corectarea unui commit. Operațiunea „fixup” permite mutarea modificărilor adăugate prin „git add” într-un commit anterior și rescrierea automată a tuturor commit-urilor ulterioare, similar cu executarea comenzii „git commit —fixup=<commit>” și lansarea „git rebase —autosquash <commit>~”.
- Pentru platforma Linux a fost implementat un proces de fundal fsmonitor, care monitorizează modificările în sistemul de fișiere utilizând mecanismul inotify și permite evitarea parcurgerii întregului director de lucru la executarea unor comenzi precum „git status”. Activarea se face prin setarea „core.fsmonitor”.
- Comanda „git repack” a fost extinsă cu modul „—write-midx=incremental”, implementând o nouă strategie pentru actualizarea metadatelor în indexul MIDX incrementat (multi-pack index), permițând evitarea reambalării întregului index. În indexul multi-pack incrementat, în locul unui singur index mare care conține informații despre distribuția obiectelor între fișierele pack, se aplică o structurare pe straturi — fiecare strat acoperă un număr specific de fișiere pack și este păstrat într-un fișier bitmap separat. Această structură permite adăugarea de date despre obiecte în noile fișiere pack, atașând noi straturi la index fără a reface straturile existente.
Comanda „git repack —write-midx=incremental” permite adăugarea unui nou strat în indexul MIDX incrementat, acoperind fișierele pack recent create. Împreună cu modul de ambalare „—geometric”, noua comandă oferă posibilitatea de a combina noi obiecte din mai multe fișiere pack într-un singur fișier pack mai mare și, dacă este necesar, de a ambala și de a fuziona mai multe straturi adiacente din indexul MIDX incrementat. Această strategie permite ca, în timpul execuției „git repack”, să se rescrie doar straturile superioare, lăsând straturile mari vechi intacte și excluzând creșterea necontrolată a lanțului de straturi, menținând numărul total de straturi la un nivel proporțional cu logaritmul numărului total de obiecte.
- Generarea hărților de disponibilitate a obiectelor a fost semnificativ optimizată datorită unui nou algoritm de parcurs al arborelui de obiecte, care exclude recursia inutilă, face caching privind pozițiile obiectelor, sortează hărțile bitmap înainte de a le unește prin operația XOR și reproiectează codul pentru crearea hărților bitmap de pseudo-fuzionare (pseudo-merge). În repositoarul de testare, optimizările au permis reducerea timpului de generare a hărților de la 612 la 294 de secunde.
- Funcția de executare paralelă a hook-urilor independente în fișierele de configurare a fost implementată. Hook-urile care afectează starea comună sau o iau în considerare, cum ar fi cele care schimbă notele de commit sau inspectează indici și arborele de lucru, nu pot fi executate în paralel. Totuși, este posibil să se execute în paralel hook-uri pentru validarea cu linters și efectuarea testelor unitare. Hook-urile care permit execuția paralelă sunt configurate prin parametrul „hook.nume_hook.parallel = true”. Numărul de lucrări care pot fi executate simultan este determinat prin setarea hook.jobs, hook..jobs sau opțiunea de linie de comandă „-j”.
- În comanda „git pack-objects —path-walk” a fost implementată posibilitatea de a specifica filtre, cum ar fi „blob:none”, „blob:limit=”, „tree:0”, „object:type=”, „sparse:” și „combine:”. În testul efectuat, eliminarea blob-urilor în timpul executării „—path-walk” a permis o reducere de 16% a dimensiunii fișierului pack generat.
- A fost adăugată comanda „git format-rev” pentru a formata revizii și nume de obiecte menționate în listele de commit-uri sau întâlnite în text aleator (de exemplu, poate fi utilizată în hook pentru procesarea notelor de commit).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Escaparea majorității secvențelor de control ale terminalului este activată implicit în mesajele de informații și textul erorilor transmise. serverul. La accesarea unei resurse dăunătoare, server astfel de secvențe escape puteau fi utilizate pentru a ascunde sau modifica ieșirea, de exemplu, prin secvențe escape pentru mutarea cursorului și curățarea textului. Suportul pentru secvențele escape pentru evidențierea elementelor cu culoare a fost lăsat.
- Comanda „git checkout -m” acum salvează automat modificările locale conflictuale în zona stash fără a fi necesar să rezolvăm imediat conflictul.
- Comanda „git push” a fost extinsă cu posibilitatea de a trimite o ramură către mai multe servere externe Git cu o singură comandă. De exemplu, pentru a trimite ramura main nu doar pe serverul principal, ci și pe oglinzi, se poate crea un grup „publish” din servere „github”, „gitlab” și „mirror”:
git config remotes.publish „github gitlab mirror”
git push publish main - Comanda „git log —graph” a fost adăugată opțiunea „—graph-lane-limit=” pentru a limita numărul de benzi verticale în vizualizarea ramurilor, ceea ce permite păstrarea spațiului pe ecran pentru datele despre comit-uri în repozitoarele cu un număr mare de ramuri.
…
* | | | | 619931f561 Combină ramura ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: simplificare a comparației GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h: curățare a GIT_GNUC_PREREQ() și a UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filtrează pathspec înainte de lstat - În comenzile „git log” și „git rev-list” a fost adăugată opțiunea „—max-count-oldest=”, care permite selectarea celor N cele mai vechi comit-uri din interval.
Sursa: opennet.ro
