Git 2.55 pievieno komandu git history fixup, kas iešuj sagatavotās izmaiņas kādā vecākā komitā un pēc tam pārliek visus tam sekojošos komitus virsū. Līdz šim tas pašam prasīja divus soļus: vispirms git commit --fixup, tad git rebase --autosquash. Laidiens iznāca 29. jūnijā, pie tā strādāja vairāk nekā 100 cilvēku, no kuriem 33 komitēja Git pirmo reizi.
Tā ir viena no vairākām izmaiņām, kas taupa laiku ikdienas darbā. Otra lielā ir iebūvētais failu uzraugs fsmonitor, kas tagad darbojas arī uz Linux. Trešā ir pāris optimizāciju, kuras lielos repozitorijos saīsina gaidīšanu no minūtēm uz sekundēm.
Vēstures labošana bez rebase dejas
Komanda git history parādījās jau 2.54 versijā ar darbībām reword un split. Versija 2.55 tai pievieno fixup. Sagatavo izmaiņas ar git add, tad palaid git history fixup <komits>. Git ievieto izmaiņas norādītajā komitā un no jauna uzliek visus tā pēctečus, neaiztiekot darba koku vai indeksu. Ar karodziņu --reedit-message vari tai pašā reizē pārrakstīt arī komita ziņu.
Atšķirībā no interaktīvā rebase šeit nav redaktora ar komitu sarakstu, kur var kļūdīties rindā vai nejauši izmest komitu. Komanda strādā arī tukšā (bare) repozitorijā, jo tā neaiztiek darba failus. Kopā ar 2.54 pievienoto reword un split tas nozīmē, ka trīs biežākos vēstures labojumus tagad var izdarīt bez rebase. Pilns saraksts ar jaunumiem ir GitHub bloga laidiena piezīmēs.
Āķi, kas skrien reizē
Git 2.53 ieviesa āķus, ko definē konfigurācijā. Agrāk tie dzīvoja tikai atsevišķos izpildāmos failos mapē .git/hooks. Versija 2.55 ļauj konfigurācijas āķus palaist paralēli. Ja projektā ir divi neatkarīgi pre-commit āķi (viens lintingam, otrs vienībtestiem) un abi deklarē hook.<nosaukums>.parallel = true, Git tos palaiž vienā laikā.
Vienlaicīgo darbu skaitu regulē trīs veidos: globāli ar hook.jobs, pa notikumam ar hook.<notikums>.jobs vai komandrindā ar git hook run -j. Uz lēnas mašīnas ar smagiem testiem tas var būt starpība starp divām sekundēm un pieciem.
Konfigurācijā definētie āķi risina arī vecu sāpi. Faili mapē .git/hooks neietilpst repozitorijā, tāpēc komanda tos nedabū pati un katrs iesācējs tos uzstāda no jauna. Konfigurācijas āķus var glabāt versiju kontrolē un koplietot komandā, sistēmā vai lietotāja līmenī.
fsmonitor tagad arī uz Linux
Failu uzraugs fsmonitor paātrina komandas git status un git diff, jo Git nav jāapstaigā viss darba koks, lai atrastu izmaiņas. Dēmons prasa failu sistēmai, kuri faili ir mainījušies kopš pēdējās reizes. Līdz šim tas darbojās tikai macOS un Windows. Versija 2.55 pievieno Linux, kur pamatā ir kodola mehānisms inotify. Ieslēdz to ar git config core.fsmonitor true.
Ir viena nianse, ko der zināt. inotify katram uzraugāmajam failam patērē vienu uzraugu (watch), tāpēc ļoti lielā repozitorijā var nākties palielināt sistēmas limitu fs.inotify.max_user_watches. Citādi uzraugs klusi izlaidīs daļu koka un rezultāts būs nepilnīgs.
Lielie repozitoriji: mazāk gaidīšanas
Vairākas izmaiņas mērķē tieši uz milzu repozitorijiem, kur uzturēšana maksā dārgi. Bitmap indeksa ģenerēšana vienā lielā repozitorijā saruka no aptuveni 612 uz aptuveni 294 sekundēm. Pseido-apvienojumu (pseudo-merge) apstaigāšana kļuva teju 20 reizes ātrāka.
Klāt ir inkrementāla multi-pack indeksa pārpakošana. Komanda git repack --write-midx=incremental --geometric=2 -d vairs nepārraksta visu indeksu no nulles. Tā vietā tā pieliek jaunu slāni virs esošā. Uzvedību regulē repack.midxSplitFactor un repack.midxNewLayerThreshold. Atsevišķi git pack-objects --path-walk vienā mērījumā deva par aptuveni 16 % mazāku pakas izmēru. Tehniskais apraksts pieejams LWN rakstā par Git 2.55.
Šie skaitļi attiecas uz repozitorijiem ar miljoniem komitu, piemēram, Linux kodolu vai lielu uzņēmuma monorepo. Uz maza projekta ar dažiem simtiem failu starpību neredzēs. Toties uzturēšanas serveriem, kas naktīs pārpako simtiem repozitoriju, katra ietaupītā minūte summējas.
Neviena no jaunajām komandām nav obligāta. Vecās darbplūsmas turpina strādāt tāpat kā līdz šim, tikai lielos repozitorijos jaunie ceļi ir manāmi ātrāki.
Vēl pa sīkam
Var definēt attālināto repozitoriju grupu ar remotes.publish "github gitlab mirror" un pēc tam ar vienu komandu git push publish main nosūtīt izmaiņas uz visiem trim vienlaikus. Komandai git log --graph pievienots karodziņš --graph-lane-limit=<n>, kas ierobežo attēloto zaru joslu skaitu, lai grafs neizplešas pāri visam ekrāna platumam. Kopums ir aprakstīts arī Linuxiac.
Git 3.0 mērķis joprojām ir šī gada beigas. Tur noklusētais zara nosaukums mainīsies no master uz main un daļa mazo utilītu pāries uz Rust. Versija 2.55 tam sagatavo augsni, bet vēl nelauž neko esošu. Kas tagad vēlas izmēģināt inkrementālo pārpakošanu vai git history fixup, var atjaunināt Git jau šodien pa parasto kanālu, jo 2.55 ir stabils laidiens.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.