Predstavljen je izid distribuiranega sistema za upravljanje izvorno kodo Git 2.56. Koda Git je licencirana pod GPLv2+. V primerjavi s prejšnjim izidom je v novo različico vključeno 748 sprememb, ki so jih pripravili 104 razvijalci, od katerih jih je 39 prvič sodelovalo pri razvoju Gita. Glavne novosti (1, 2, 3):
- Dodana je možnost 'git add —resolved' za reševanje konfliktov pri združevanju vej, ki preverja datoteke na prisotnost oznak konflikta in ob odkritju oznake vsaj v eni datoteki prikaže napako, ne indeksira nobene datoteke in prikaže seznam datotek, ki potrebujejo popravilo. V nasprotju z ukazom 'git add —update' v novem načinu obdelujejo samo datoteke, ki so v stanju konflikta, medtem ko se spremenjene datoteke, ki niso povezane s konfliktom, ignorirajo, kar omogoča varno dokončanje združevanja vej, tudi če so v delovnem imeniku druge nekončane spremembe (ukaz 'git add —update' je dodal v indeks vse prej sledene spremenjene datoteke v delovnem imeniku).
- Znatno je pospešeno delo z velikimi repozitoriji, zahvaljujoč optimizaciji algoritma za iskanje zadnjih skupnih commitov pri združevanju vej in primerjanju commitov. V procesu dela zdaj upoštevamo commite, pripadajoče izključno eni od vej, kar omogoča, da skeniranje ustavimo takoj po odkritju vseh možnih skupnih prednikov, ne da bi porabili čas za nadaljnje raziskovanje zgodovine sprememb. V enem od testiranih repozitorijev se je hitrost iskanja povprečno povečala 20-krat, v drugem pa je bilo pospeševanje doseženo do 70-krat. Pri izvajanju ukaza 'git merge-base —all v4.8 v4.9' v repozitoriju z jedrom Linux se je število korakov preiskovanja zmanjšalo z 167 tisoč na 3.8 tisoč.
- Za strežniške namene je prilagojen način pakiranja „—path-walk“, ki omogoča ustvarjanje bolj kompaktnih pack-datotek z združevanjem objektov po njihovih poteh v drevesni strukturi (na primer, za repozitorij Fluent UI je uporaba „—path-walk“ omogočila zmanjšanje velikosti pack-datoteke s 558 MB na 164 MB). V novi različici je bila реализирана možnost uporabe načina „—path-walk“ skupaj z bitnimi kartami dosegljivosti (reachability bitmap) in delta otoki (delta island), ki jih uporabljajo git gostitelji za pospešitev dela in izolacijo forkov od glavnega repozitorija.
- Odpravljene so bile ozke grla, ki so vodila do pretiranih izračunov v velikih repozitorijih: odpravljene so dodatne preverbe stanja datotek pri zapisu v reftable; izključeno je ponovno skeniranje seznama pri vsakem vstavljanju nove pack-datoteke; pospešene so operacije s reftable, kjer je bilo shranjenih veliko zapisov o brisanju; optimizirano je delovanje „git diff“ pri navedbi omejitev po datotečnih poteh. Po opravljenih optimizacijah je delo z reftable pri velikem številu brisanj pospešeno 65-krat (s 13 sekund na 0,2 sekunde), izvedba problematične ukaz „git diff“ v repozitoriju Chromium s 500000 elementi v indeksu pa sedaj traja 0,07 sekunde namesto 8 minut.
- Eksperimentalna ukaza „git history“, ki ponuja možnosti za prepis zgodovine sprememb, je dodana operacija „git history drop“ za odstranitev izbrane zaveze z avtomatskim priklepom njenih potomcev na starševsko zavezo.
- Dodana je ukaz „git branch —delete-merged ‘origin/*’ ‘topic-*'“ za varno odstranjevanje skupin lokalnih vej, katerih spremembe so že bile prenesene v zunanji repozitorij. Za filtriranje vej in repozitorijev je dovoljeno uporabljati maske. Za analizo kandidatov za odstranitev, brez dejanskega izvajanja operacije, lahko uporabite zastavico „—dry-run“.
- Dodana je ukaz „git refs create|update|delete|rename“, v katerem so združene nizkoodvisne operacije za ustvarjanje, odstranjevanje, preimenovanje in posodabljanje referenc.
- V ukaz „git bisect run“ je dodana možnost „—reset-when-found=[]“, ki avtomoatsko vrne repozitorij v stanje pred začetkom iskanja ali pusti aktivno problematično zavezo, brez potrebe po posebej izvajanju ukaza „git bisect reset“.
- V ekipi „git replay“ je dodana opcija „—linearize“ za korišćenje ravne topologije spajanja, analogno „git rebase —no-rebase-merges“, ali bez pristupa radnom stablu.
- U timu „git log —follow“ implementirano je praćenje preimenovanja datoteka u nelinearnoj istoriji promena, na primer, prilikom spajanja grana. Putanja do datoteke se sada beleži posebno za svaku roditeljsku reviziju, što čini rezultat nezavisnim od redosleda prelaska kroz istoriju revizija.
- Dodana je mogućnost primene komande „git repack -a —filter=blob:limit=1m —drop-filtered“ za uklanjanje velikih blob-objekata, učitavanih na zahtev iz spoljnog repozitorijuma i koji se ne koriste u trenutnom indeksu. Kada se kasnije pristupi tim objektima, ona će se automatski ponovo učitati.
- U timu „git log —graph“ za grafove sa više nezavisnih korena implementirano je dodavanje uvlačenja za lakše odvajanje nesporazuma između revizija.
- Obezbeđeno je prepoznavanje tipičnih grešaka, kao što je navođenje „git push origin/main“ umesto „git push origin main“ ili „git branch —set-upstream-to origin main“ umesto „git branch —set-upstream-to=origin/main“, uz isporuku saveta za korišćenje ispravne verzije.
Izvor: opennet.ru
