Git 2.41 fontkontrolsistemo havebla

Post tri monatoj da evoluo, la liberigo de la distribua fontkontrola sistemo Git 2.41 estis publikigita. Git estas unu el la plej popularaj, fidindaj kaj alt-efikecaj versikontrolaj sistemoj, kiu disponigas flekseblajn ne-liniajn evoluilojn bazitajn sur disbranĉiĝo kaj kunfandado de branĉoj. Por certigi la integrecon de la historio kaj reziston al retroaktivaj ŝanĝoj, implicita hashing de la tuta antaŭa historio en ĉiu kommit estas uzata, ankaŭ eblas kontroli individuajn etikedojn kaj kommitaĵojn per ciferecaj subskriboj de la programistoj.

Kompare kun la antaŭa eldono, 542 ŝanĝoj estis akceptitaj en la novan version, preparitan kun la partopreno de 95 programistoj, el kiuj 29 partoprenis la evoluon por la unua fojo. Ĉefaj novigoj:

  • Plibonigita uzado de neatingeblaj objektoj, kiuj ne estas referencitaj en la deponejo (branĉoj aŭ etikedoj ne estas referencitaj). Neatingeblaj objektoj estas forigitaj de la rubkolektanto, sed restas en la deponejo dum certa tempo antaŭ forigo por eviti vetkurkondiĉojn. Por konservi trakon de la periodo de neatingeblaj objektoj, necesas ligi etikedojn al ili kun la ŝanĝotempo de similaj objektoj, kio ne ebligas stoki ilin en unu pakdosiero, en kiu ĉiuj objektoj havas komunan ŝanĝotempon. Antaŭe, ĉiu neatingebla objekto estis konservita en aparta dosiero, kio kaŭzis problemojn se ekzistis granda nombro da freŝaj neatingeblaj objektoj kiuj ankoraŭ ne estis submetataj al forigo. En la nova eldono, defaŭlte, la mekanismo "cruft packs" estas uzata por paki neatingeblajn objektojn, kio ebligas stoki ĉiujn neatingeblajn objektojn en unu pakdosiero, kaj reflekti la datumojn pri la modifa tempo de ĉiu objekto en aparta tabelo stokita en tabelo. dosiero kun la etendo ".mtimes" kaj ligita per indeksa dosiero kun la etendo ".idx".
    Git 2.41 fontkontrolsistemo havebla
  • Defaŭlte, konservi inversan indekson (revindex) sur disko por pakaj dosieroj estas ebligita. Se testite sur la deponejoj de torvalds/linukso, la uzo de inversa indekso permesis al ni akceli rimedintensajn "git push" operaciojn je 1.49 fojojn, kaj simplajn operaciojn, kiel kalkuli la grandecon de ununura objekto uzante "git cat- dosiero --batch='%(objectsize:disk)' » 77 fojojn. Dosieroj ("".rev") kun inversa indekso estos konservitaj en la deponejo en la dosierujo ".git/objects/pack".

    Memoru, ke Git konservas ĉiujn datumojn en la formo de objektoj, kiuj estas metitaj en apartajn dosierojn. Por pliigi la efikecon labori kun la deponejo, objektoj estas aldone metitaj en pakdosierojn, en kiuj informoj estas prezentitaj en formo de fluo de objektoj sekvantaj unu post alia (simila formato estas uzata kiam oni transdonas objektojn kun la git fetch kaj git). puŝaj komandoj). Indeksa dosiero (.idx) estas kreita por ĉiu pakdosiero, kiu ebligas al vi tre rapide determini la ofseton en la pakdosiero per kiu la donita objekto estas konservita per la objektoidentigilo.

    La inversa indekso inkluzivita en la nova eldono celas plifaciligi la procezon determini la objektan ID el informoj pri la loko de la objekto en la paka dosiero. Antaŭe, tia konvertiĝo estis farita sur la flugo dum la analizado de la pakdosiero kaj estis konservita nur en memoro, kio ne permesis reuzon de tiaj indeksoj kaj devigis la indekson esti generita ĉiufoje. La operacio de konstruado de indekso estas reduktita al konstruado de aro de objekto-poziciaj paroj kaj ordigado de ĝi laŭ pozicio, kio povas daŭri longan tempon por grandaj pakaj dosieroj.

    Ekzemple, la operacio de montrado de la enhavo de objektoj, kiu uzas rektan indekson, estis 62 fojojn pli rapida ol la operacio de montrado de la grandeco de objektoj, por kiu la pozicio-al-objekta rilatdatenoj ne estis indeksitaj. Post uzi la inversan indicon, ĉi tiuj operacioj komencis daŭri proksimume la saman tempon. Inversaj indeksoj ankaŭ ebligas al vi akceli la operacion de sendo de objektoj dum plenumado de preni kaj puŝi komandojn rekte transdonante pretajn datumojn de disko.

    Git 2.41 fontkontrolsistemo havebla

  • Aldonita subteno por pasi WWW-Authenticate-titolojn inter la akredittraktilo kaj la aŭtentikigservo al la "akreditaĵohelpanto" protokolo uzita por pasi akreditaĵojn kiam aliro al limigitaj deponejoj. Subteno por la WWW-Authenticate-titolo permesas al OAuth-ampleksooparametroj esti pasitaj al pli granule aparta uzantaliro al deponejoj kaj limi la ampleksojn disponeblajn por petoj.
  • Aldonita formatopcio "%(malantaŭe: )", kiu ebligas tuj ricevi informojn pri la nombro da kommit-oj ĉeestantaj aŭ forestantaj en certa branĉo, rilate al alia branĉo (kiom unu branĉo postrestas aŭ antaŭ alia je la nivelo de kommit-oj). Antaŭe, ricevi ĉi tiujn informojn bezonis du apartajn komandojn: "git rev-list --count main..my-feature" por ricevi la nombron da kommits unikaj al branĉo, kaj "git rev-list --count my-feature.. main" por ricevi la nombron mankantajn komitaĵojn. Nun tiaj kalkuloj povas esti reduktitaj al ununura instrukcio, kiu simpligas skribajn prizorgantojn kaj reduktas ekzekuttempon. Ekzemple, por montri nekunfanditajn branĉojn kaj taksi ĉu ili estas malantaŭ aŭ antaŭ sia ĉefa branĉo, vi povas uzi unulinion: $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(ahead-behind :origin/HEAD)' \ refs/heads/tb/ | kolumno -t tb/cruft-extra-tips 2 96 tb/for-each-ref—ekskludi 16 96 tb/roaring-bitmaps 47 3 anstataŭ la antaŭe uzata skripto, kiu estas 17 fojojn pli malrapida: $ git for-each-ref — format='%(refnomo:mallonga)' --no-merged=origin/HEAD \ refs/heads/tb | dum 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" "$antaŭe" "$malantaŭ" farita | kolumno -t tb/cruft-extra-tips 2 96 tb/por-ĉiu-ref—ekskludi 16 96 tb/roaring-bitmaps 47 3
  • Aldonita "--porcelano" opcio al "git fetch" komando, kiu generas eligon en la formato " ”, malpli legebla, sed pli oportuna por analizado en skriptoj.
  • Aldonita "fetch.hideRefs" agordo por akceli "git fetch" operaciojn kaŝante parton de la ligiloj en la loka deponejo ĉe la stadio de kontrolado ke la servilo sendis la plenan aron da objektoj, kio ŝparas tempon limigante la kontrolon nur al serviloj. de kiu datumoj estas rekte prenitaj. Ekzemple, dum testado en sistemo kun deponejoj kiuj enhavas grandan nombron da spuritaj eksteraj ligiloj, ekskludante ĉiujn ligilojn krom tiuj adresitaj al la $remote cela servilo reduktis la "git fetch" operacion de 20 minutoj ĝis 30 sekundoj. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ alportu $remote
  • La komando "git fsck" efektivigas la kapablon kontroli por korupto, kontrolsumo-kongruo kaj ĝusteco de valoroj en alireblaj bitmapoj kaj inversaj indeksoj.
  • La komando "git clone --local" nun montras eraron kiam oni provas kopii el deponejo enhavanta simbolajn ligilojn ene de $GIT_DIR.

fonto: opennet.ru

Aldoni komenton