După trei luni de dezvoltare, a fost publicată versiunea distribuită a sistemului de gestionare a codului sursă Git 2.41. Git este unul dintre cele mai populare, fiabile și performante sisteme de gestionare a versiunilor, oferind instrumente flexibile pentru dezvoltarea non-liniară bazate pe ramificarea și fuziunea ramurilor. Pentru a asigura integritatea istoriei și rezistența la modificările retroactive, se utilizează hashing-ul implicit al întregii istorii anterioare în fiecare commit, extinzând astfel posibilitatea de a autentifica digital semnăturile dezvoltatorilor pentru anumite etichete și commit-uri.
În comparație cu versiunea anterioară, noua versiune include 542 de modificări, pregătite cu ajutorul a 95 de dezvoltatori, dintre care 29 au participat pentru prima dată la dezvoltare. Principalele noutăți:
- A fost îmbunătățită gestionarea obiectelor inaccesibile (unreachable) la care nu există referințe în depozit (nu sunt folosite de ramuri sau etichete). Obiectele inaccesibile sunt șterse de către colectorul de gunoi, dar rămân în depozit pentru o perioadă de timp pentru a evita stările de concurență. Pentru a urmări perioada de retenție a obiectelor inaccesibile, este necesar să le fie atașate etichete cu data modificării acestora, ceea ce împiedică stocarea lor într-un singur fișier pack în care toate obiectele au aceeași dată de modificare. Anterior, fiecare obiect inaccesibil era salvat într-un fișier separat, ceea ce ducea la probleme în cazul unui număr mare de obiecte inaccesibile recente, care nu erau încă supuse ștergerii. În noua versiune, pentru ambalarea obiectelor inaccesibile, este utilizat în mod implicit mecanismul „cruft packs”, care permite stocarea tuturor obiectelor inaccesibile într-un singur fișier pack, iar datele despre data modificării fiecărui obiect sunt reflectate într-un tabel separat, stocat într-un fișier cu extensia „.mtimes” și legat printr-un fișier index cu extensia „.idx”.

- Implicitly, reverse index (revindex) logging is enabled for pack files by default. Testing on the torvalds/linux repository revealed that implementing the reverse index accelerated resource-intensive "git push" operations by 1.49 times, while simple operations, such as calculating the size of a single object using "git cat-file —batch='%(objectsize:disk)'" sped up 77 times. The files (".rev") with the reverse index will be stored within the repository in the directory ".git/objects/pack".
It is important to remember that Git stores all data in the form of objects, which are placed in separate files. To enhance repository performance, objects are additionally placed into pack files, where information is presented as a stream of consecutive objects (a similar format is used for transferring objects with the git fetch and git push commands). For each pack file, an index file (.idx) is created, allowing the quick determination of the offset in the pack file associated with an object identifier.
The newly included reverse index aims to optimize the process of identifying object identifiers based on the object's placement information within the pack file. Previously, this transformation was done on-the-fly while parsing the pack file, and data was only stored in memory, making it impossible to reuse such indexes and forcing them to be generated every time. The indexing operation involves creating an array of "object-position" pairs and sorting it by position, which can take a lot of time for large pack files.
For instance, the operation of outputting object content using the direct index was 62 times faster than the operation of showing object sizes, for which the position-object linkage data was not indexed. After utilizing the reverse index, the indicated operations began to take approximately the same amount of time. Reverse indexes also help speed up object sending operations during fetch and push commands by allowing the direct transfer of already prepared data from the disk.

- În protocolul „credential helper”, utilizat pentru transmiterea credentialelor atunci când se accesează depozitele cu acces restricționat, a fost adăugată suportul pentru transmiterea anteturilor WWW-Authenticate între handler-ul credentialelor și serviciul unde se realizează autentificarea. Suportul pentru antetul WWW-Authenticate permite transmiterea parametrilor scope OAuth pentru o diviziune mai granulară a accesului utilizatorului la depozite și pentru delimitarea zonelor disponibile pentru cereri.
- Comenzile for-each-ref au fost adăugate opțiunea de formatare „%(ahead-behind:)”, care permite obținerea rapidă a informațiilor despre numărul de commit-uri prezente sau absente într-o anumită ramură, în raport cu o altă ramură (cât de mult o ramură este în urma sau înaintea alteia la nivel de commit-uri). Precedent, pentru a obține astfel de informații, era necesar să executați două comenzi separate: „git rev-list —count main..my-feature” pentru a obține numărul de commit-uri unice pentru ramură și „git rev-list —count my-feature..main” pentru a obține numărul commit-urilor lipsă. Acum, aceste calcule pot fi reduse la o singură comandă, ceea ce simplifică scrierea handler-elor și reduce timpul de execuție. De exemplu, pentru a arăta ramurile care nu au fost îmbinate și a evalua întârzierile sau avansurile față de ramura principală, se poate utiliza o comandă de tip one-liner: $ git for-each-ref —no-merged=origin/HEAD \ —format='%(refname:short) %(ahead-behind:origin/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3 în locul scriptului anterior folosit, care se executa de 17 ori mai lent: $ git for-each-ref —format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead="$(git rev-list —count origin/HEAD..$ref)" behind="$(git rev-list —count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" done | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3
- La comanda „git fetch” a fost adăugată opțiunea „—porcelain”, care, atunci când este specificată, produce un output în formatul „ ”, mai puțin ușor de citit, dar mai convenabil pentru parse în scripturi.
- A fost adăugată setarea „fetch.hideRefs”, care permite accelerarea operațiunilor „git fetch” prin ascunderea unei părți din referințe în repository-ul local în timpul verificării de către server a setului complet de obiecte, ceea ce economisește timp, limitând verificarea doar la servere, din care se extrag date direct. De exemplu, atunci când se efectuează un test pe un sistem cu repositoare care conțin un număr mare de linkuri externe urmărite, excluderea tuturor linkurilor, cu excepția celor adresate țintă server $remote, a permis reducerea duratei de execuție a operației „git fetch” de la 20 de minute la 30 de secunde. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- Comanda „git fsck” a implementat posibilitatea de a verifica deteriorările, conformitatea sumelor de control și corectitudinea valorilor în hărțile de disponibilitate și indecșii inversi.
- Comanda „git clone —local” a implementat un mesaj de eroare la încercarea de copiere dintr-un repository care conține linkuri simbolice în cadrul $GIT_DIR.
Sursa: opennet.ro


