A apărut versiunea sistemului distribuit de gestionare a codului sursă Git 2.31. Git este unul dintre cele mai populare, fiabile și eficiente sisteme de gestionare a versiunilor, oferind instrumente flexibile pentru dezvoltarea non-lineară, bazate pe ramificare și îmbinarea ramurilor. Pentru a asigura integritatea istoricului și rezistența la modificări "retrospective", se utilizează hashing-ul implicit al întregului istoric anterior în fiecare commit, fiind posibilă și verificarea prin semnături digitale a dezvoltatorilor pentru anumite tag-uri și commit-uri.
Comparativ cu versiunea anterioară, noua versiune include 679 de modificări pregătite cu ajutorul a 85 de dezvoltatori, dintre care 23 au participat pentru prima dată la dezvoltare. Principalele noutăți:
- A fost adăugată comanda „git maintenance”, care permite executarea lucrărilor periodice pe sistemele care nu suportă cron. De exemplu, prin intermediul noii comenzi, se poate organiza o execuție periodică a procesului de comprimare a repository-ului, astfel încât să nu fie necesar să așteptați finalizarea blocării repository-ului în timpul execuției automate a comprimării în timpul rulării diferitelor comenzi. Comanda „git maintenance” permite efectuarea optimizărilor și operațiunilor de menținere a unei structuri optime a repository-ului în mod de fundal, fără a bloca sesiunea interactivă — o dată pe oră, se realizează o sarcină de preîncărcare a obiectelor noi din repository-ul remote și actualizarea fișierului cu graficul commit-urilor, iar în fiecare noapte se lansează procesul de comprimare a repository-ului.
- A fost adăugată suportul pentru menținerea pe disc a unui index invers (revindex) pentru fișierele pack. Să reamintim că Git stochează toate datele sub formă de obiecte, care sunt plasate în fișiere separate. Pentru a crește eficiența lucrului cu repository-ul, obiectele sunt suplimentar plasate în fișiere pack, în care informația este prezentată sub forma unui flux de obiecte, care urmează unul după altul (un format similar este folosit la transferul de obiecte prin comenzile git fetch și git push). Pentru fiecare fișier pack, se creează un fișier index (.idx), care permite, prin identificatorul obiectului, o determinare foarte rapidă a deplasării în fișierul pack, unde este stocat acest obiect. Indexul invers (.rev) propus în Git 2.31 este destinat optimizării procesului de identificare a identificatorului obiectului pe baza informațiilor despre plasarea obiectului în fișierul pack.
Anterior, această transformare a fost efectuată în timp real în timpul analizei fișierului pack și a fost stocată doar în memorie, ceea ce nu permitea reutilizarea unor astfel de indici și obliga la generarea unui nou index de fiecare dată. Operația de construcție a indexului se reduce la construirea unui array de perechi „obiect-poziție” și sortarea acestuia după poziție, ceea ce poate dura mult timp pentru fișierele pack mari.
De exemplu, operația de afisare a conținutului obiectelor, în care se folosește un index direct, s-a realizat de 62 de ori mai repede decât operația de afișare a dimensiunii obiectelor, pentru care datele despre legătura dintre poziție și obiect nu erau indexate. După utilizarea indexului invers, aceste operații au început să dureze cam la fel de mult. Indicii inversi permit, de asemenea, accelerarea operațiunilor de trimitere a obiectelor în timpul comenzii fetch și push, datorită transferului direct de date deja pregătite de pe disc. În mod implicit, indicii inversi nu sunt creați, iar pentru generarea lor este necesară activarea setării „git config pack.writeReverseIndex true” urmată de împachetarea repository-ului cu comanda „git repack -Ad”.
- Au fost adăugate optimizări de performanță bazate pe apariția în formatul de fișier commit-graph, utilizat pentru a optimiza accesul la informațiile despre commit-uri, noi date despre numărul de generație a commit-ului, care pot fi folosite pentru a accelera operațiunile suplimentare cu commit-uri.
- Au fost extinse posibilitățile de a redefini numele principalului branch, utilizat implicit în noile repository-uri (setarea init.defaultBranch). Atunci când se accesează repository-uri externe, git încearcă să extragă branch-ul la care pointează HEAD, adică dacă externul serverul folosește implicit branch-ul „main”, operația „git clone” va încerca să extragă local „main”. În Git 2.31, suportul pentru o astfel de extragere este acum implementat și pentru repository-uri goale. De exemplu, când se clonează local un nou repository înainte de a adăuga primele patch-uri, copia locală va conține acum numele principalului branch setat pe extern. server numele principalului branch implicit.
- A fost adăugată opțiunea „—disk-usage” la comanda „git rev-list”, permițându-le să afișeze un rezumat al dimensiunii obiectelor.
- În anticiparea viitoarei înlocuiri a backend-ului pentru execuția fuziunilor, a fost semnificativ optimizată determinarea redenumirilor.
- Suportul pentru biblioteca învechită de expresii regulate PCRE1 a fost oprit.
- A fost introdusă posibilitatea de a interzice forțat utilizarea link-urilor scurte, activă indiferent de algoritmul de hash. Interdicția se activează prin asignarea valorii „no” parametrului core.abbrev.
- Comenzii „git rev-parse” i s-a adăugat opțiunea „—path-format=(absolute|relative)” pentru definirea explicită a ieșirii căilor relative sau absolute.
- În scripturile pentru completarea automată a inputului în Bash, s-a simplificat adăugarea regulilor de completare pentru subcomenzile proprii „git”.
- Comenzii „git bundle” i s-a adăugat opțiunea „—stdin” pentru a citi linkurile din fluxul de intrare standard.
- Comenzii „git log” i s-a adăugat o nouă opțiune „—diff-merges=”.
- Comenzii „git ls-files” i s-a adăugat opțiunea „—deduplicatecan” pentru eliminarea duplicatelor la ieșire.
- Au fost adăugate noi măști pentru excluderea intervalelor de commit-uri — „^!” și „^-.”.
- Comenzii „git range-diff” i s-au adăugat opțiunile „—left-only” și „—right-only” pentru a arăta doar o parte a intervalului comparat.
- În comenzile „git diff” și „git log” au fost adăugate opțiunile „—skip-to=” și „—rotate-to=” pentru a sări sau a muta la final căile inițiale.
- Comenzii „git difftool” i s-a adăugat opțiunea „—skip-to=” pentru a relua sesiunea întreruptă de la un anumit path.
- Codul de conduită (Code-of-conduct), care definește principiile fundamentale pentru rezolvarea conflictelor între dezvoltatori, a fost actualizat la versiunea 2.0 (anterior se folosea versiunea 1.4).
Sursa: opennet.ro
