29. jūnijā izlaistā Git 2.55 pirmo reizi būvē ar Rust atbalstu, kas ieslēgts pēc noklusējuma. Makefile karodziņš, kas agrāk saucās WITH_RUST, tagad ir NO_RUST — tas ir, Rust vairs nav jāieslēdz ar roku, bet jāizslēdz, ja negribi. To pašu izmaiņu ieviesa arī Meson būvē.
Praksē tas nozīmē vienu konkrētu lietu: ja tu būvē Git no pirmkoda — savā CI konveijerā, Docker attēlā vai izplatījuma paketē — tagad tur jābūt Rust rīkkopai (rustc un cargo). Kas to nesagatavoja, tam būve pārtrūks. Kamēr negribi to darīt uzreiz, būvē ar NO_RUST=1 un viss paliek pa vecam.
Kur Rust jau strādā Git iekšās
Git komanda nepārraksta visu C kodu uzreiz. Pieeja ir pakāpeniska: atsevišķas apakšsistēmas pāriet uz Rust, kamēr pārējais paliek C. Pirmie kandidāti ir xdiff — dzinējs aiz diff un apvienošanas — un reftable atsauču aizmugure, kur agrīnie eksperimenti uzrādīja tīrāku kodu un mazāk izpildlaika kļūdu.
Iemesls ir atmiņas drošība. Rust kompilēšanas laikā pārbauda, ka atmiņu atbrīvo tieši vienreiz un ka atsauce nepārdzīvo datus, uz kuriem tā rāda. Tas izslēdz veselu kļūdu klasi — bufera pārrakstīšanu un use-after-free —, kas C kodā gadu desmitiem prasa manuālu uzmanību. Sīkāk pāreju apraksta GitHub izlaiduma apskats.
Vislielāk to izjūt izplatījumu uzturētāji un tie, kas Git iepako paši. GitLab atzīmē, ka pāreja notiek pakāpeniski tieši tāpēc, lai iepakotājiem būtu laiks pievienot Rust rīkkopu pie būves atkarībām. Kamēr Git vēl var būvēt bez Rust, karodziņa apvēršana no WITH_RUST uz NO_RUST rāda virzienu: kādā no nākamajām versijām Rust kļūs obligāts.
git history fixup — labo veco commit bez rebase
Git 2.54 ieviesa eksperimentālu komandu git history. Versija 2.55 tai pievieno apakškomandu fixup. Komanda git history fixup <commit> paņem to, kas šobrīd ir indeksā (staged), un pielej to kādam agrākam commit — bez interaktīvā rebase deju soļiem.
Tas ir tas pats scenārijs, ko līdz šim risināja ar git commit --fixup plus rebase --autosquash: pamani kļūdu commit, kas jau ir dažus soļus atpakaļ, un gribi to salabot tur, kur tā radās. Komanda joprojām ir atzīmēta kā eksperimentāla, tāpēc uzvedība nākamajās versijās var mainīties.
Praktiskais brīdinājums šai versijai ir viens: pārbaudi, vai tavs CI, kas būvē Git no pirmkoda, iepriekš uzstāda Rust rīkkopu. Citādi pāreja uz 2.55 apstādina konveijeru.
Ātrāks git status un repack lielos repozitorijos
Divas izmaiņas mēra uz lielām kodabāzēm. Pirmā — FSMonitor tagad strādā arī Linux. Līdz šim failu sistēmas novērotājs, kas ļauj git status nepārmeklēt visu koku, bija pieejams tikai macOS un Windows. Git 2.55 pieslēdzas Linux kodola inotify apakšsistēmai. Ieslēdz to ar core.fsmonitor; ļoti lielam repozitorijam var nākties palielināt fs.inotify.max_user_watches, citādi kodols nepietiks vietas visiem novērojamajiem failiem.
Otrā — inkrementālais multi-pack indekss (MIDX). Kopš Git 2.47 MIDX var būvēt slāņos, un tagad git repack --write-midx=incremental raksta šos slāņus tieši, nepārrakstot visu indeksu no jauna. Slāņu skaitu tur logaritmisku attiecībā pret objektu skaitu, ko regulē repack.midxSplitFactor un repack.midxNewLayerThreshold. GitHub apskatā minēts konkrēts mērījums: bitkaršu ģenerēšana kritās no aptuveni 612 līdz aptuveni 294 sekundēm. Phoronix uzskaita arī pārējos ātruma labojumus.
Āķi tagad var iet paralēli
Ja projektam ir vairāki neatkarīgi pre-commit āķi — teiksim, viens linterim, otrs vienībtestiem —, Git 2.55 tos var palaist vienlaikus. Katram āķim, ko drīkst darbināt paralēli, konfigurācijā liec hook.<nosaukums>.parallel = true. Vienlaicīgo darbu skaitu regulē hook.jobs vai karodziņš -j. Āķi, kam vajag koplietotu stāvokli, joprojām iet secīgi — to paralēli nedarbina.
Āķu paralēlisms strādā tikai tad, ja tos palaiž pati Git; ārējie skripti, kas āķus izsauc paši, jāpielāgo atsevišķi.
Sīkākie labojumi, ko izstrādātājs pamana
Vēl viena izmaiņa skar daļējos (partial) klonus, kur objektus lejupielādē pēc pieprasījuma. Agrāk git grep un git cherry katram trūkstošam blob veica atsevišķu servera pieprasījumu; Git 2.55 tos apvieno vienā apmaiņā, tāpēc komandas pār lieliem daļējiem kloniem beidzas ātrāk. Klāt arī jaunas atsauču sarunas (negotiation) vadīklas, kas ļauj precīzāk noteikt, kuras atsauces piedalās, kad klients un serveris vienojas par kopīgo vēsturi. Eksperimentāli parādās arī komanda git format-rev.
Versijā pielikuši roku vairāk nekā 100 cilvēku, no tiem 33 pirmoreiz. Vairākas no šīm izmaiņām ved uz Git 3.0, kur plānots reftable padarīt par noklusējuma atsauču formātu jauniem repozitorijiem. Ko tieši lauzīs nākamā lielā versija, projekts uztur BreakingChanges dokumentā.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.