Három hónapos fejlesztés után megjelent a Git 2.41-es verziója, amely egy elosztott forráskódkezelő rendszer. A Git az egyik legnépszerűbb, megbízható és nagy teljesítményű verziókezelő rendszer, amely rugalmas eszközöket kínál a nemlineáris fejlesztéshez, ágazásra és átkonvertálásra építve. A történelem integritásának és a visszamenőleges módosítások elleni ellenállás biztosítása érdekében minden egyes elkötelezettségben automatikusan hash-eli a korábbi történelem egészét, valamint lehetőség van a fejlesztők digitális aláírásaival az egyes címkék és elkötelezettségek hitelesítésére.
Az előző kiadással összehasonlítva az új verzió 542 módosítást tartalmaz, amelyeket 95 fejlesztő készített, közülük 29-en először vettek részt a fejlesztésben. A legfontosabb újítások:
- Javították az elérhetetlen objektumok (unreachable) kezelését, amelyekre a tárolóban nincsenek hivatkozások (ágak vagy címkék nem hivatkoznak rájuk). Az elérhetetlen objektumokat a szemétgyűjtő eltávolítja, de eltávolítás előtt egy ideig a tárolóban maradnak a versenyhelyzetek kizárása érdekében. Az elérhetetlen objektumok megléte idején a releváns címkéket az objektumok módosítási idejéhez kell kapcsolni, ami megakadályozza, hogy az összes objektumot egy pack-fájlban tartsuk, amelyben az összes objektumnak közös módosítási ideje van. Korábban minden elérhetetlen objektum külön fájlban lett tárolva, ami problémákhoz vezetett, ha sok friss elérhetetlen objektum volt, amely még nem esett el az eltávolítástól. Az új verzióban az elérhetetlen objektumok csomagolásához alapértelmezés szerint a „cruft packs” mechanizmus használatos, amely lehetővé teszi, hogy az összes elérhetetlen objektumot egy pack-fájlban tartsunk, az egyes objektumok módosítási idejéről szóló adatokat pedig egy külön táblázatban rögzítjük, amely a „.mtimes” kiterjesztésű fájlban van tárolva és kapcsolódik egy „.idx” kiterjesztésű indexfájl segítségével.

- Alapértelmezés szerint engedélyezve van a visszamenőleges index (revindex) tárolása a pack-fájlokhoz. A torvalds/linux tárolón végzett tesztelés során a visszamenőleges index használata lehetővé tette a nagy erőforrást igénylő „git push” műveletek 1.49-szeres gyorsítását, míg az egyszerű műveletek, mint egyetlen objektum méretének kiszámítása a „git cat-file —batch=’%(objectsize:disk)'” segítségével, 77-szer felgyorsultak. A visszamenőleges indexet tartalmazó fájlok („.rev”) a tárolón belül a „.git/objects/pack” könyvtárban lesznek mentve.
Emlékezzünk, hogy a Git az összes adatot objektumok formájában tárolja, amelyeket külön fájlokban helyez el. A tárolóval való hatékonyabb munka érdekében az objektumokat további pack-fájlokba helyezik, ahol az információ objektumok folyamának formájában van jelen, amelyek egymás után következnek (hasonló formátumot használnak az objektumok git fetch és git push parancsokkal történő átvitelénél). Minden pack-fájlhoz indexfájl (.idx) készül, amely lehetővé teszi, hogy az objektum azonosítója alapján nagyon gyorsan meghatározzuk a pack-fájlban lévő eltolást, ahol az objektum tárolva van.
Az új kiadásban szereplő fordított index célja, hogy optimalizálja az objektumazonosító meghatározásának folyamatát az objektum pack-fájlban való elhelyezkedésének információja alapján. Korábban ez a konverzió a pack-fájl elemzése közben történt, és csak a memóriában tárolták, ami nem tette lehetővé az ilyen indexek újbóli felhasználását, és minden alkalommal indexet kellett generálni. Az indexépítési művelet az „objektum-hely” párok tömbjének létrehozására és azok pozíció szerinti rendezésére redukálódik, ami nagy pack-fájlok esetén időigényes lehet.
Például az objektumok tartalmának megjelenítése, amely közvetlen indexet használ, 62-szer gyorsabban zajlott, mint az objektumok méretének megjelenítése, amelynél az objektum és a pozíció közötti kapcsolat adatai nem voltak indexelve. A fordított index használata után az említett műveletek körülbelül ugyanannyi időt kezdtek igényelni. A fordított indexek segítik a push és fetch parancsok futtatásakor az objektumok küldésének felgyorsítását azáltal, hogy az előkészített adatokat közvetlenül az lemezről továbbítják.

- A hitelesítő adatok átviteléhez használt 'credential helper' protokollhoz hozzáadták a WWW-Authenticate fejléc továbbításának támogatását a hitelesítési szolgáltatás és a hitelesítő adatok feldolgozó közötti kommunikáció során, amelyet a korlátozott hozzáférésű tárolókhoz való hozzáféréskor használnak. A WWW-Authenticate fejléc támogatása lehetővé teszi, hogy OAuth scope paramétereket továbbítsanak a felhasználói hozzáférés finomabb elválasztásához a tárolókhoz, és a lekérdezésekhez hozzáférhető területek elkülönítéséhez.
- A for-each-ref parancsba hozzáadva a «%(ahead-behind:<base>)» formázási opció, amely lehetővé teszi, hogy egyszerre nyerjünk információkat arról, hogy hány commit található egy bizonyos ágon, illetve hány hiányzik egy másik ághoz képest (mennyire marad el vagy előzi meg az egyik ág a másikat commit szinten). Korábban ehhez két külön parancsot kellett végrehajtani: «git rev-list —count main..my-feature» a kizárólag az ághoz tartozó commitok számának megkapásához és «git rev-list —count my-feature..main» a hiányzó commitok számának megismeréséhez. Most már ezek a számítások egyetlen parancsra egyszerűsíthetők, ami megkönnyíti a feldolgozók írását és csökkenti a végrehajtási időt. Például, a nem egyesített ágak megjelenítésére és azok elmaradásának vagy előnyének értékelésére használható egy egysoros parancs: $ 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 a korábban használt szkripthez képest, amely 17-szer lassabban fut: $ 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
- A «git fetch» parancsba hozzáadva a «—porcelain» opció, amelynek megadásával a kimenet «<flag> <old-object-id> <new-object-id> <local-reference>» formátumba kerül, ami kevésbé olvasható, de könnyebben feldolgozható szkriptekben.
- Hozzáadva a «fetch.hideRefs» beállítás, amely felgyorsítja a «git fetch» műveleteket azáltal, hogy elrejti a helyi tárolóban lévő hivatkozások egy részét a teljes objektumkészlet elküldésének ellenőrzésekor, ami lehetővé teszi az időmegtakarítást az ellenőrzés korlátozásával szerverek, ahonnan közvetlenül nyerik az adatokat. Például, egy olyan rendszeren végzett teszt során, amely nagy számú külső hivatkozást tartalmazó tárolókkal rendelkezik, az összes hivatkozás, kivéve a célzott szerverhez $remote, eltávolítása a «git fetch» művelet időtartamát 20 percről 30 másodpercre csökkentette. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs\/remotes\/$remote \ fetch $remote
- A «git fsck» parancsban megvalósítva a sérülések ellenőrzésének, a checksumok megfelelőségének és a bit-térképek és fordított indexek elérhetőségi értékeinek helyességének ellenőrzési lehetősége.
- A "git clone --local" parancs addig megjelenít egy hibát, amíg megpróbálja másolni a $GIT_DIR-ben található szimbolikus hivatkozásokat tartalmazó tárolóból.
Forrás: opennet.ru


