A fost lansată versiunea 2.37 a sistemului distribuit de gestionare a codului sursă Git. Git este unul dintre cele mai populare, fiabile și performante sisteme de control al versiunilor, oferind instrumente flexibile pentru dezvoltarea neliniară, bazate pe ramificare și fuzionare. Pentru a asigura integritatea istoricului și a fi rezistent la modificări „retroactive”, se folosește hashing-ul implicit al întregului istoric anterior în fiecare commit, fiind posibilă, de asemenea, certificarea digitală a semnăturilor dezvoltatorilor pentru anumite etichete și commituri.
Comparativ cu versiunea anterioară, noua versiune a înregistrat 395 de modificări, pregătite cu participarea a 75 de dezvoltatori, dintre care 20 au participat pentru prima dată la dezvoltare. Cele mai importante inovații sunt:
- Mecanismul indecșilor parțiali (sparse index) a fost pregătit pentru utilizare pe scară largă, acoperind doar o parte a depozitului. Indecșii parțiali permit îmbunătățirea performanței și economisirea spațiului în depozitele în care se desfășoară operațiuni de clonare parțială (sparse-checkout) sau se lucrează cu o copie incompletă a depozitului. În noua versiune, s-a încheiat integrarea indecșilor parțiali în comenzile „git show”, „git sparse-checkout” și „git stash”. Cea mai semnificativă creștere a performanței datorată utilizării indecșilor parțiali este observată în comanda „git stash”, a cărei viteză de execuție a crescut cu 80% în anumite situații.
- A fost implementat un nou mecanism „cruft packs” pentru ambalarea obiectelor inaccesibile (unreachable), la care nu există legături în depozit (nu sunt referite de ramuri sau etichete). Obiectele inaccesibile sunt șterse de colectorul de gunoi, dar înainte de ștergere rămân o perioadă în depozit pentru a exclude stările de concurență. Pentru a urmări perioada de existență a obiectelor inaccesibile, este necesară asocierea lor cu etichete care indică timpul de modificare al acestor obiecte, ceea ce nu permite stocarea lor într-un singur fișier pack, în care toate obiectele au un timp comun de modificare. Salvarea anterioară a fiecărui obiect într-un fișier separat a dus la probleme atunci când existau un număr mare de obiecte inaccesibile recente, care nu erau încă supuse ștergerii. Mecanismul propus „cruft packs” permite stocarea tuturor obiectelor inaccesibile într-un singur fișier pack, iar datele despre timpul de modificare al fiecărui obiect sunt reflectate într-un tabel separat, stocat într-un fișier cu extensia „.mtimes”.
- Pentru Windows și macOS a fost implementat un mecanism încorporat de urmărire a modificărilor în sistemul de fișiere, care permite evitarea parcursului întregului director de lucru atunci când se efectuează astfel de operațiuni precum „git status”. Anterior, pentru a urmări modificările prin hook-uri, puteau fi conectate utilitare externe de urmărire a modificărilor în FS, cum ar fi Watchman, dar acest lucru necesita instalarea unor programe suplimentare și configurare. Acum, această funcționalitate este încorporată și poate fi activată cu comanda „git config core.fsmonitor true”.
- Echipa „git sparse-checkout” a declarat învechită suportul pentru modul alternativ „—cone” de determinare a șabloanelor pentru clonarea parțială, care permite, atunci când se definește partea depozitului care face obiectul operației de clonare, enumerarea fișierelor individuale utilizând sintaxa „.gitignore”, ceea ce nu permite utilizarea indecșilor parțiali pentru optimizare.
- Flexibilitatea în configurarea apelului fsync() pentru scrierea modificărilor pe disc a fost îmbunătățită. Parametrul „core.fsyncMethod” a fost extins pentru a include suport pentru strategia de sincronizare „batch”, care permite accelerarea procesului de scriere a unui număr mare de fișiere individuale prin acumularea modificărilor în cache-ul de scriere, care este îndeplinit printr-un singur apel fsync(). Testul efectuat, în cadrul căruia au fost adăugate 500 de fișiere prin comanda „git add”, a fost realizat în 0.15 secunde, în timp ce apelarea fsync() pentru fiecare fișier a durat 1.88 secunde, iar fără utilizarea fsync – 0.06 secunde.
- În comenzile de navigare a ramurilor, cum ar fi „git log” și „git rev-list”, a fost adăugată opțiunea „—since-as-filter=X”, care permite filtrarea informațiilor despre commituri a căror dată de creare este mai veche de „X”. Spre deosebire de opțiunea „—since”, noua comandă funcționează ca un filtru, fără a opri parcurgerea după primul commit mai vechi decât data specificată.
- În comanda „git remote”, la folosirea flag-ului „-v” se asigură afișarea informațiilor despre clone parțiale ale repository-ului.
- A fost adăugată setarea „transfer.credentialsInUrl”, care poate accepta valorile „warn”, „die” și „allow”. În cazul în care în parametrul „remote..url” sunt specificate acreditive în text clar, încercarea de a efectua operațiuni „fetch” sau „push” va fi finalizată cu o eroare dacă setarea „transfer.credentialsInUrl” are valoarea „die”, sau cu un avertisment dacă este setată pe „warn”.
- Implemetarea nouă a modului interactiv al comenzii „git add -i”, rescris din Perl în C, este activată în mod implicit.
Sursa: opennet.ro
