Даступная сістэма кіравання зыходнымі тэкстамі Git 2.41

Пасля трох месяцаў распрацоўкі апублікаваны выпуск размеркаванай сістэмы кіравання зыходнымі тэкстамі Git 2.41. Git з'яўляецца адной з самых папулярных, надзейных і высокапрадукцыйных сістэм кіравання версіямі, якая прадстаўляе гнуткія сродкі нелінейнай распрацоўкі, якія базуюцца на адгалінаванні і зліцці галінак. Для забеспячэння цэласнасці гісторыі і ўстойлівасці да змен «заднім лікам» выкарыстоўваюцца няяўнае хэшаванне ўсёй папярэдняй гісторыі ў кожным коміце, таксама магчыма пасведчанне лічбавымі подпісамі распрацоўшчыкаў асобных тэгаў і коммітаў.

У параўнанні з мінулым выпускам у новую версію прынята 542 змены, падрыхтаваныя пры ўдзеле 95 распрацоўшчыкаў, з якіх 29 упершыню прынялі ўдзел у распрацоўцы. Асноўныя навіны:

  • Палепшана апрацоўка недасяжных аб'ектаў (unreachable), на якія ў рэпазітары адсутнічаюць спасылкі (не спасылаюцца галінкі ці тэгі). Недасягальныя аб'екты выдаляюцца зборшчыкам смецця, але да выдалення пэўны час застаюцца ў рэпазітары для выключэння станаў гонкі. Для адсочвання перыяду знаходжання недасяжных аб'ектаў неабходна прывязка да іх пазнак з часам змены падобных аб'ектаў, што не дазваляе захоўваць іх у адным pack-файле, у якім усе аб'екты маюць агульны час змены. Раней кожны недасяжны аб'ект захоўваўся ў асобным файле, што прыводзіла да праблем пры наяўнасці вялікай колькасці свежых недасяжных аб'ектаў, якія яшчэ не падпадаюць пад выдаленне. У новым выпуску для пакавання недасяжных аб'ектаў па змаўчанні задзейнічаны механізм "cruft packs", які дазваляе захоўваць усе недасягальныя аб'екты ў адным pack-файле, а дадзеныя аб часе мадыфікацыі кожнага аб'екта адлюстроўваць у асобнай табліцы, якая захоўваецца ў файле з пашырэннем ". mtimes" і якая злучаецца пры дапамозе індэкснага файла з пашырэннем ".idx".
    Даступная сістэма кіравання зыходнымі тэкстамі Git 2.41
  • Уключана па змаўчанні вядзенне на дыску зваротнага азначніка (revindex) для pack-файлаў. Пры тэставанні на рэпазітары torvalds/linux ужыванне зваротнага азначніка дазволіла паскорыць рэсурсаёмістыя аперацыі «git push» у 1.49 разу, а простыя аперацыі, такія як вылічэнне памеру аднаго аб'екта пры дапамозе «git cat-file -batch='%(objectsize:disk)' » у 77 разоў. Файлы (".rev") са зваротным азначнікам будуць захаваныя ўсярэдзіне рэпазітараў у каталогу ".git/objects/pack".

    Нагадаем, што Git захоўвае ўсе дадзеныя ў форме аб'ектаў, якія размяшчаюцца ў асобных файлах. Для падвышэння эфектыўнасці працы з рэпазітаром аб'екты дадаткова змяшчаюцца ў pack-файлы, у якіх інфармацыя прадстаўлена ў форме струменя з аб'ектаў, наступных сябар за сябрам (аналагічны фармат выкарыстоўваецца пры перадачы аб'ектаў камандамі git fetch і git push). Для кожнага pack-файла ствараецца індэксны файл (.idx), які дазваляе па ідэнтыфікатары аб'екта вельмі хутка вызначыць зрушэнне ў pack-файле, па якім захоўваецца дадзены аб'ект.

    Уключаны ў новым выпуску зваротны індэкс накіраваны на аптымізацыю працэсу вызначэння ідэнтыфікатара аб'екта па інфармацыі аб размяшчэнні аб'екта ў pack-файле. Раней такое пераўтварэнне выконвалася на ляту падчас разбору pack-файла і захоўвалася толькі ў памяці, што не дазваляла паўторна выкарыстоўваць падобныя азначнікі і змушала генераваць азначнік кожны раз. Аперацыя пабудовы азначніка зводзіцца да пабудовы масіва з пар «аб'ект-пазіцыя» і яго сартаванню па пазіцыі, што можа займаць шмат часу для вялікіх pack-файлаў.

    Напрыклад, аперацыя вываду змесціва аб'ектаў, у якой выкарыстоўваецца прамы індэкс, выконвалася ў 62 разы хутчэй, чым аперацыя паказу памеру аб'ектаў, для якой дадзеныя аб сувязі пазіцыі з аб'ектам не індэксаваліся. Пасля выкарыстання зваротнага азначніка паказаныя аперацыі сталі займаць прыкладна аднолькавы час. Зваротныя азначнікі таксама дазваляюць паскорыць аперацыі адпраўкі аб'ектаў пры выкананні каманд fetch і push за кошт прамой перадачы ўжо гатовых дадзеных з дыска.

    Даступная сістэма кіравання зыходнымі тэкстамі Git 2.41

  • У пратакол "credential helper", які ўжываецца для перадачы ўліковых дадзеных пры звароты да рэпазітараў з абмежаваным доступам, дададзеная падтрымка перадачы загалоўкаў WWW-Authenticate паміж апрацоўшчыкам уліковых дадзеных і сэрвісам, у якім вырабляецца аўтэнтыфікацыя. Падтрымка загалоўка WWW-Authenticate дазваляе перадаваць scope-параметры OAuth для больш грануляванага падзелу доступу карыстача да рэпазітараў і размежаванні абласцей, даступных для запытаў.
  • У каманду for-each-ref дададзена опцыя фарматавання «%(ahead-behind: )», якая дазваляе зараз атрымаць звесткі пра колькасць комітаў, якія прысутнічаюць або адсутнічаюць у пэўнай галінцы, адносна іншай галінкі (на колькі адна галінка адстае або апярэджвае іншую на ўзроўні комітаў). Раней для атрымання падобнай інфармацыі патрабавалася выканаць дзве асобныя каманды: "git rev-list -count main..my-feature" для атрымання колькасці ўнікальных для галіны комітаў і "git rev-list -count my-feature..main" для атрымання ліку адсутных комітаў. Цяпер падобныя вылічэнні можна звесці да адной каманды, што спрашчае напісанне апрацоўшчыкаў і скарачае час выканання. Напрыклад для паказу не прайшоўшых зліцця галінак і адзнакі адставання ці апярэджанні іх асноўнай галінкі можна выкарыстоўваць аднарадкоўнік: $ :origin/HEAD)' \ refs/heads/tb/ | 2 замест раней ужывальнага скрыпту, які выконваецца ў 96 разоў павольней: $ 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 16 96 tb/for-each-ref-exclude 47 3 tb/roaring-bitmaps 17 2
  • У каманду "git fetch" дададзена опцыя "-porcelain", пры ўказанні якой фармуецца выснова ў фармаце " », меней чытэльны, але зручнейшы для разбору ў скрыптах.
  • Дададзена налада «fetch.hideRefs», якая дазваляе паскорыць аперацыі «git fetch» ​​за кошт утойвання часткі спасылак у лакальным рэпазітары на стадыі праверкі адпраўкі серверам поўнага набору аб'ектаў, што дазваляе зэканоміць час, абмежаваўшы праверку толькі сервераў, з якіх напроста здабываюцца дадзеныя. Напрыклад, пры правядзенні тэсту на сістэме з рэпазітарамі, утрымоўвальнымі вялікі лік адсочваных вонкавых спасылак, выключэнне ўсіх спасылак, акрамя адрасаваных мэтаваму серверу $remote, дазволіла скараціць выкананне аперацыі «git fetch» ​​з 20 хвілін да 30 секунд. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • У камандзе "git fsck" рэалізавана магчымасць праверкі пашкоджанняў, адпаведнасці кантрольных сум і карэктнасці значэнняў у бітавых картах даступнасці і зваротных індэксах.
  • У камандзе "git clone -local" рэалізаваны выснова памылкі пры спробе капіявання з рэпазітара, які змяшчае сімвалічныя спасылкі ўнутры $GIT_DIR.

Крыніца: opennet.ru

Дадаць каментар