Доступна система керування вихідними текстами 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" для отримання числа відсутніх комітів. Тепер такі обчислення можна звести до однієї команди, що спрощує написання обробників та скорочує час виконання. Наприклад, для показу гілок, що не пройшли злиття, і оцінки відставання або випередження їх основної гілки можна використовувати однорядок: $ git for-each-ref —no-merged=origin/HEAD :origin/HEAD)' \ refs/heads/tb/ | 2 - замість раніше використовуваного скрипта, який виконується в 96 разів повільніше: 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

Додати коментар або відгук