Efter tre mÄnaders utveckling publicerades version 2.41 av det distribuerade systemet för hantering av kÀllkod Git. Git Àr ett av de mest populÀra, pÄlitliga och högpresterande versionshanteringssystemen, som erbjuder flexibla verktyg för icke-linjÀr utveckling, baserad pÄ förgrening och sammanslagning av grenar. För att sÀkerstÀlla integriteten i historiken och motstÄndet mot förÀndringar "i efterhand" anvÀnds implicit hashning av hela den tidigare historiken i varje commit, och det Àr ocksÄ möjligt att verifiera med digitala signaturer frÄn utvecklare av specifika taggar och commits.
JÀmfört med den föregÄende versionen har 542 Àndringar gjort i den nya versionen, förberedda med deltagande av 95 utvecklare, varav 29 deltog i utvecklingen för första gÄngen. De viktigaste nyheterna Àr:
- FörbÀttrad hantering av oÄtkomliga objekt (unreachable), pÄ vilka det i repositoryt saknas referenser (varken grenar eller taggar refererar till dem). OÄtkomliga objekt tas bort av skrÀpsamlaren, men förblir i repositoryt en stund innan de tas bort för att undvika race conditions. För att spÄra perioden som oÄtkomliga objekt finns, mÄste taggar kopplas till dem med Àndringstidpunkter, vilket förhindrar att de lagras i en enda pack-fil dÀr alla objekt har en gemensam Àndringstid. Tidigare sparades varje oÄtkomligt objekt i en separat fil, vilket ledde till problem nÀr det fanns mÄnga nya oÄtkomliga objekt som Ànnu inte var kvalificerade för borttagning. I den nya versionen anvÀnds en mekanism för "cruft packs" som standard för att packa oÄtkomliga objekt, vilket gör det möjligt att lagra alla oÄtkomliga objekt i en enda pack-fil och reflektera data om Àndringstidpunkten för varje objekt i en separat tabell som lagras i en fil med tillÀgget ".mtimes", kopplad via en indexfil med tillÀgget ".idx".

- Stöd för spĂ„rning av omvĂ€nd index (revindex) för pack-filer har aktiverats som standard pĂ„ disken. Vid testning pĂ„ repositoryt torvalds/linux gjorde anvĂ€ndningen av omvĂ€nd index att resurskrĂ€vande operationer som "git push" kunde snabbas upp med 1.49 gĂ„nger, och enklare operationer, som att berĂ€kna storleken pĂ„ ett objekt med "git cat-file âbatch='%(objectsize:disk)'" med 77 gĂ„nger. Filer med omvĂ€nd index (".rev") kommer att sparas inom repositoryt i katalogen ".git/objects/pack".
Vi pÄminner om att Git lagrar all data i form av objekt som placeras i separata filer. För att öka effektiviteten i arbetet med repositoryn placeras objekten dessutom i packfiler, dÀr informationen representeras som en ström av objekt som följer varandra (ett liknande format anvÀnds vid överföring av objekt med kommandona git fetch och git push). För varje packfil skapas en indexfil (.idx) som gör att man mycket snabbt kan bestÀmma offset i packfilen för det objekt som lagras med hjÀlp av objektets identifierare.
Den nya versionen inkluderar en bakÄtriktad index som syftar till att optimera processen för att identifiera objektets identifierare utifrÄn informationen om objektets placering i packfilen. Tidigare genomfördes en sÄdan omvandling i realtid under analysskedet av packfilen och lagrades endast i minnet, vilket inte tillÀt ÄteranvÀndning av sÄdana index och tvingade till att generera indexet varje gÄng. Indexeringens process innebÀr att man bygger en array av 'objekt-position' par och sorterar den efter position, vilket kan ta lÄng tid för stora packfiler.
Till exempel utfördes operationen för att visa innehÄllet i objekten, dÀr den direkta indexen anvÀndes, 62 gÄnger snabbare Àn operationen för att visa storleken pÄ objekten, för vilken data om samband mellan position och objekt inte indexerades. Efter anvÀndning av bakÄtriktat index blev dessa operationer ungefÀr lika snabba. BakÄtriktade index gör det ocksÄ möjligt att snabba upp operationerna för att skicka objekt vid anvÀndning av kommandona fetch och push genom att direkt överföra redan fÀrdiga data frÄn disken.

- I protokollet för 'credential helper', som anvÀnds för att överföra autentiseringsuppgifter nÀr man kontaktar repositories med begrÀnsad Ätkomst, har stöd för överföring av HTTP-headers WWW-Authenticate lagts till mellan credential handler och tjÀnsten dÀr autentisering görs. Stödet för headern WWW-Authenticate möjliggör överföring av OAuth-scope-parametrar för att ge en mer detaljerad uppdelning av anvÀndarÄtkomst till repositories och avgrÀnsning av omrÄden som Àr tillgÀngliga för förfrÄgningar.
- I kommandot for-each-ref har ett formateringsalternativ lagts till "%(ahead-behind:<base>)", vilket gör att man samtidigt kan fĂ„ information om antalet commits som finns eller inte finns i en viss gren, i förhĂ„llande till en annan gren (hur mycket en gren ligger efter eller före en annan nĂ€r det kommer till commits). Tidigare krĂ€vdes det att man körde tvĂ„ separata kommandon för att fĂ„ sĂ„dan information: "git rev-list âcount main..my-feature" för att fĂ„ antalet unika commits för grenen och "git rev-list âcount my-feature..main" för att fĂ„ antalet saknade commits. Nu kan dessa berĂ€kningar reduceras till ett enda kommando, vilket förenklar skrivandet av hanterare och minskar körningstiden. Till exempel, för att visa icke sammanslagna grenar och bedöma hur mycket de ligger efter eller före sin huvudgren, kan man anvĂ€nda en enradare: $ 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 istĂ€llet för det tidigare anvĂ€nda skriptet, som körs 17 gĂ„nger lĂ„ngsammare: $ 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
- I kommandot "git fetch" har ett alternativ "âporcelain" lagts till, som nĂ€r det anges genererar en utdata i formatet " ", vilket Ă€r mindre lĂ€sbart, men mer bekvĂ€mt för analys i skript.
- Ett alternativ "fetch.hideRefs" har lagts till, vilket gör det möjligt att snabba upp "git fetch"-operationer genom att dölja vissa referenser i det lokala repositoriet under kontrollen av servern om hela uppsÀttningen av objekt, vilket sparar tid genom att begrÀnsa kontrollen till servrar, frÄn vilka data hÀmtas direkt. Till exempel, vid en testkörning pÄ en system med repositorier som innehÄller mÄnga spÄrade externa referenser, gjorde undantaget av alla referenser förutom de som pekade mot mÄlet servern $remote, lyckades minska körningstiden för "git fetch" frÄn 20 minuter till 30 sekunder. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs\/remotes\/$remote \ fetch $remote
- I kommandot "git fsck" har möjligheten till kontroll av skador, kontroll av checksummor och korrekthet i vÀrdena i tillgÀnglighetsbitmaper och bakÄtvÀnd indexer genomförts.
- I teamet "git clone --local" har det implementerats en felutskrift nÀr man försöker kopiera frÄn ett repository som innehÄller symboliska lÀnkar inom $GIT_DIR.
KĂ€lla: opennet.ru


