După trei luni de dezvoltare, sistemul distribuit de control al surselor Git 2.41 a fost lansat. Git este unul dintre cele mai populare, fiabile și de înaltă performanță sisteme de control al versiunilor, oferind instrumente flexibile de dezvoltare neliniară bazate pe ramificare și îmbinare. Pentru a asigura integritatea istoriei și rezistența la modificări retroactive, în fiecare commit este utilizat hashing implicit al întregului istoric anterior; de asemenea, este posibilă certificarea etichetelor individuale și commit-urilor cu semnăturile digitale ale dezvoltatorilor.
În comparație cu versiunea anterioară, noua versiune a inclus 542 de modificări, pregătite cu participarea a 95 de dezvoltatori, dintre care 29 au participat pentru prima dată la dezvoltare. Principalele inovații:
- Gestionare îmbunătățită a obiectelor inaccesibile care nu sunt referite în depozit (nu sunt referite prin ramuri sau etichete). Obiectele inaccesibile sunt șterse de colectorul de gunoi, dar rămân în depozit un anumit timp înainte de a fi șterse pentru a evita condițiile de cursă. Pentru a urmări perioada de apariție a obiectelor inaccesibile, este necesar să le atașați etichete cu timpul de schimbare a obiectelor similare, ceea ce nu permite stocarea lor într-un fișier pachet în care toate obiectele au un timp comun de schimbare. Anterior, fiecare obiect inaccesibil era stocat într-un fișier separat, ceea ce a dus la probleme atunci când exista un număr mare de obiecte proaspete inaccesibile care nu erau încă eligibile pentru ștergere. În noua versiune, mecanismul „pachete cruft” este utilizat în mod implicit pentru împachetarea obiectelor inaccesibile, ceea ce vă permite să stocați toate obiectele inaccesibile într-un singur fișier pachet, iar datele privind timpul de modificare a fiecărui obiect sunt reflectate într-un tabel separat, stocat într-un fișier cu extensia „.mtimes” și legat folosind un fișier index cu extensia „.idx”.

- Menținerea unui index invers pe disc pentru fișierele pachet este activată în mod implicit. La testarea pe depozitul torvalds/linux, utilizarea unui index invers a făcut posibilă accelerarea operațiunilor „git push” care necesită mult resurse de 1.49 ori și operațiuni simple, cum ar fi calcularea dimensiunii unui singur obiect folosind „git cat- fișier —batch='%(objectsize:disk)' "de 77 de ori. Fișierele („.rev”) cu un index invers vor fi stocate în interiorul depozitului în directorul „.git/objects/pack”.
Amintiți-vă că Git stochează toate datele sub formă de obiecte, care se află în fișiere separate. Pentru a crește eficiența lucrului cu depozitul, obiectele sunt plasate suplimentar în fișiere pachet, în care informațiile sunt prezentate sub forma unui flux de obiecte care se succed unele pe altele (un format similar este utilizat atunci când se transferă obiecte cu git fetch și git push comenzi). Pentru fiecare fișier pachet, este creat un fișier index (.idx), care vă permite să determinați foarte rapid offset-ul în fișierul pachet la care este stocat obiectul dat folosind identificatorul de obiect.
Indexul invers inclus în noua versiune are ca scop optimizarea procesului de determinare a identificatorului obiectului din informații despre plasarea obiectului în fișierul pachet. Anterior, o astfel de conversie se făcea din mers în timp ce analiza fișierul pachet și era stocată doar în memorie, ceea ce nu permitea reutilizarea unor indici similari și forța generarea indexului de fiecare dată. Operația de construire a unui index se reduce la construirea unei matrice de perechi obiect-poziție și sortarea lui după poziție, ceea ce poate dura mult timp pentru fișierele pachet mari.
De exemplu, o operație de afișare a conținutului obiectelor, care utilizează un index direct, a fost de 62 de ori mai rapidă decât o operație de afișare a dimensiunii obiectelor, pentru care datele de la poziție la obiect nu au fost indexate. După utilizarea indexului invers, aceste operațiuni au început să dureze aproximativ același timp. Indexurile inverse vă permit, de asemenea, să accelerați operațiunile de trimitere a obiectelor atunci când executați comenzi de preluare și împingere prin transferul direct de date gata făcute de pe disc.

- Protocolul „ajutor de acreditări”, folosit pentru a transfera acreditările atunci când se accesează depozite cu acces limitat, a adăugat suport pentru trecerea antetelor WWW-Authenticate între handlerul de acreditări și serviciul în care se realizează autentificarea. Suportul pentru antetul WWW-Authenticate vă permite să transmiteți parametrii domeniului OAuth pentru o separare mai granulară a accesului utilizatorilor la depozite și delimitarea domeniilor disponibile pentru solicitări.
- S-a adăugat opțiunea de formatare „%(ahead-behind:” la comanda for-each-ref: )”, care vă permite să obțineți imediat informații despre numărul de comiteri prezente sau absente într-o anumită ramură, raportat la o altă ramură (cât este în urmă sau înaintea unei ramuri față de alta la nivel de comit). Anterior, pentru a obține astfel de informații, trebuia să rulați două comenzi separate: „git rev-list —count main..my-feature” pentru a obține numărul de comite unic pentru ramură și „git rev-list —count my-feature” ..principal” pentru a obține numărul de comite lipsă. Acum, astfel de calcule pot fi reduse la o singură comandă, ceea ce simplifică scrierea manipulanților și reduce timpul de execuție. De exemplu, pentru a afișa ramurile care nu au fost îmbinate și pentru a evalua dacă sunt în spatele sau în fața ramurilor principale, puteți utiliza o singură linie: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(ahead-behind :origin/HEAD)' \refs/heads/tb/ | coloana -t tb/cruft-extra-tips 2 96 tb/for-each-ref—excludeți 16 96 tb/roaring-bitmaps 47 3 în loc de scriptul folosit anterior, care rulează 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 origine/HEAD..$ref)" behind="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" terminat | coloana -t tb/cruft-extra-tips 2 96 tb/pentru-each-ref—excludeți 16 96 tb/roaring-bitmaps 47 3
- Opțiunea „-porțelan” a fost adăugată la comanda „git fetch”, când este specificată, ieșirea este generată în formatul „ ", mai puțin lizibil, dar mai convenabil pentru analizarea în scripturi.
- A fost adăugată setarea „fetch.hideRefs”, care vă permite să accelerați operațiunile „git fetch” prin ascunderea unora dintre referințe în depozitul local în timpul etapei de verificare a trimiterii unui set complet de obiecte de către server, ceea ce vă permite să economisiți timp prin limitarea verificării la doar servere, din care datele sunt extrase direct. De exemplu, atunci când se execută un test pe un sistem cu depozite care conțin un număr mare de linkuri externe urmărite, excluzând toate linkurile cu excepția celor adresate către țintă Server `$remote` a redus timpul de execuție al 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” oferă posibilitatea de a verifica dacă există corupție, conformitatea sumei de control și corectitudinea valorilor în hărțile de biți de accesibilitate și indexurile inverse.
- Comanda „git clone --local” afișează acum o eroare la încercarea de a copia dintr-un depozit care conține legături simbolice în interiorul $GIT_DIR.
Sursa: opennet.ru


