Git 2.41 källkontrollsystem tillgängligt

Efter tre månaders utveckling har releasen av det distribuerade källkontrollsystemet Git 2.41 publicerats. Git är ett av de mest populära, pålitliga och högpresterande versionskontrollsystemen som tillhandahåller flexibla icke-linjära utvecklingsverktyg baserade på förgrening och sammanslagning av grenar. För att säkerställa historiens integritet och motstånd mot retroaktiva förändringar används implicit hash av hela den tidigare historien i varje commit, det är även möjligt att verifiera individuella taggar och commits med digitala signaturer från utvecklarna.

Jämfört med den tidigare utgåvan, accepterades 542 ändringar i den nya versionen, beredd med deltagande av 95 utvecklare, varav 29 deltog i utvecklingen för första gången. Huvudsakliga innovationer:

  • Förbättrad hantering av oåtkomliga objekt som inte refereras i förvaret (grenar eller taggar refereras inte). Oåtkomliga föremål tas bort av sopsamlaren, men förblir i förvaret en viss tid innan de tas bort för att undvika tävlingsförhållanden. För att hålla reda på perioden för oåtkomliga objekt är det nödvändigt att binda etiketter till dem med ändringstiden för liknande objekt, vilket inte tillåter lagring av dem i en pack-fil, där alla objekt har en gemensam ändringstid. Tidigare lagrades varje oåtkomligt objekt i en separat fil, vilket ledde till problem om det fanns ett stort antal nya oåtkomliga objekt som ännu inte var föremål för radering. I den nya utgåvan används "cruft packs"-mekanismen som standard för att packa oåtkomliga objekt, vilket gör det möjligt att lagra alla oåtkomliga objekt i en packfil och reflektera data om ändringstiden för varje objekt i en separat tabell lagrad i en fil med filtillägget ".mtimes" och länkad med en indexfil med filtillägget ".idx".
    Git 2.41 källkontrollsystem tillgängligt
  • Som standard är upprätthållande av ett omvänt index (revindex) på disken för packfiler aktiverat. När den testades på torvalds/linux-förvaren, tillät användningen av ett omvänt index oss att snabba upp resurskrävande "git push"-operationer med 1.49 gånger, och enkla operationer, som att beräkna storleken på ett enstaka objekt med "git cat- file --batch='%(objectsize:disk)' » 77 gånger. Filer (".rev") med ett omvänt index kommer att lagras i arkivet i katalogen ".git/objects/pack".

    Kom ihåg att Git lagrar all data i form av objekt, som placeras i separata filer. För att öka effektiviteten i arbetet med förvaret placeras objekt dessutom i packfiler, där information presenteras i form av en ström av objekt som följer efter varandra (ett liknande format används vid överföring av objekt med git fetch och git push-kommandon). En indexfil (.idx) skapas för varje packfil, vilket gör att du mycket snabbt kan bestämma förskjutningen i packfilen med vilken det givna objektet lagras av objektidentifieraren.

    Det omvända indexet som ingår i den nya versionen syftar till att effektivisera processen för att bestämma objekt-ID från information om objektets plats i packfilen. Tidigare utfördes en sådan konvertering i farten under analysen av packfilen och lagrades endast i minnet, vilket inte tillät återanvändning av sådana index och tvingade indexet att genereras varje gång. Arbetet med att bygga ett index reduceras till att bygga en uppsättning objekt-positionspar och sortera den efter position, vilket kan ta lång tid för stora packfiler.

    Till exempel var operationen att visa innehållet i objekt, som använder ett direkt index, 62 gånger snabbare än operationen att visa storleken på objekt, för vilka relationsdata för position till objekt inte indexerades. Efter att ha använt det omvända indexet började dessa operationer ta ungefär samma tid. Omvända index låter dig också påskynda funktionen för att skicka objekt när du kör hämta- och push-kommandon genom att direkt överföra färdiga data från disken.

    Git 2.41 källkontrollsystem tillgängligt

  • Lade till stöd för att skicka WWW-Authenticate-rubriker mellan autentiseringshanteraren och autentiseringstjänsten till "credential helper"-protokollet som används för att skicka inloggningsuppgifter vid åtkomst till begränsade arkiv. Stöd för WWW-Authenticate-huvudet tillåter att OAuth-omfångsparametrar skickas till mer detaljerad separat användaråtkomst till arkiv och avgränsar de omfång som är tillgängliga för begäranden.
  • Lade till formatalternativ "%(ahead-behind: )", vilket gör att du omedelbart kan få information om antalet commits som finns eller saknas i en viss gren, i förhållande till en annan gren (hur mycket en gren släpar efter eller före en annan på commitnivån). Tidigare krävde att få denna information två separata kommandon: "git rev-list --count main..my-feature" för att få antalet commits unikt för en gren, och "git rev-list --count my-feature. main" för att få numret som saknas commits. Nu kan sådana beräkningar reduceras till en enda instruktion, vilket förenklar skrivhanterare och minskar exekveringstiden. Till exempel, för att visa osammanslagna grenar och utvärdera om de ligger bakom eller före sin huvudgren, kan du använda en one-liner: $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(ahead-behind :origin/HEAD)' \ refs/heads/tb/ | kolumn -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 är 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" klar | kolumn -t tb/cruft-extra-tips 2 96 tb/för-varje-ref—exkludera 16 96 tb/vrålande-bitmappar 47 3
  • Lade till alternativet "--porslin" till kommandot "git fetch", som genererar utdata i formatet " ”, mindre läsbar, men bekvämare för att analysera i skript.
  • Lade till "fetch.hideRefs"-inställningen för att påskynda "git fetch"-operationer genom att dölja en del av länkarna i det lokala förvaret i stadiet för att verifiera att servern skickade hela uppsättningen objekt, vilket sparar tid genom att begränsa kontrollen endast till servrar varifrån data hämtas direkt. Till exempel, när man testade på ett system med arkiv som innehåller ett stort antal spårade externa länkar, exklusive alla länkar utom de som är adresserade till $remote-målservern minskade "git fetch"-operationen från 20 minuter till 30 sekunder. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ hämta $remote
  • Kommandot "git fsck" implementerar möjligheten att leta efter korruption, kontrollsummamatchning och korrekthet av värden i tillgänglighetsbitmappar och omvända index.
  • Kommandot "git clone --local" visar nu ett fel när man försöker kopiera från ett arkiv som innehåller symboliska länkar inuti $GIT_DIR.

Källa: opennet.ru

Lägg en kommentar