
представлений реліз розподіленої системи керування вихідними текстами Git 2.55. Серед ключових змін: включення за замовчуванням складання з Rust, реалізація для Linux процесу fsmonitor, нова стратегія переупаковки інкрементального MIDX-індексу, команда git history fixup для виправлення комміту, оптимізація генерації бітових карт доступності об'єктів, підтримка паралельного виконання хуків, команда git format-rev. Код Git поширюється під ліцензією GPLv2+.
Порівняно з минулим випуском у нову версію прийнято 505 змін, підготовлених за участю 100 розробників, 33 із яких вперше взяли участь у розробці Git.
Основні нововведення (github.blog, gitlab.com/blog, gitlab.com/git-scm):
- За замовчуванням включено підтримка компонентів мовою Rust. Компілятор rustc доданий до складу складальних залежностей. Для складання без Rust можна використовувати прапор NO_RUST=1 під час запуску утиліти make або -Drust=disabled під час виконання meson configure. Можливість відключення збірки з Rust підтримуватиметься до гілки Git 3.0, в якій Rust буде включений до обов'язкових залежностей. На мові Rust реалізований прошарок для переносимості між конфігураціями з хешами SHA-1 та SHA-256, а також деякі внутрішні функції, такі як кодування та декодування цілісних значень змінної довжини. У майбутньому очікується переробка на Rust більш значних внутрішніх компонентів Git.
- В експериментальну команду "git history", що надає можливості для перезапису історії змін, додано операцію "git history fixup" для виправлення комміту. Операція fixup дозволяє перенести зміни, додані через git add, до більш раннього комміту та автоматично переписати всі наступні комміти за аналогією з виконанням команди git commit —fixup= і запуску git rebase - autosquash ~.
- Для платформи Linux реалізовано фоновий процес fsmonitor, що відстежує зміни у файловій системі за допомогою механізму прищеплювати і дозволяє обійтися без перебору всього робочого каталогу під час виконання таких команд, як git status. Увімкнення здійснюється через налаштування «core.fsmonitor».
- У команду git repack доданий режим - write-midx = incremental, що реалізує нову стратегію оновлення метаданих в інкрементальному MIDX-індексі (multi-pack index), що дозволяє обійтися без перепакування всього індексу. В інкрементальному багатопакетному індексі замість одного великого індексу, що містить інформацію про розподіл об'єктів за pack-файлами, застосовується поділ на шари - кожен шар охоплює певну кількість pack-файлів і зберігається в окремому bitmap-файлі. Подібна структура дозволяє додавати в індекс дані про об'єкти в нових pack-файлах, прикріплюючи до індексу нові шари без перебудови вже наявних шарів. У поєднанні з режимом упаковки репозиторіїв - geometric нова команда дає можливість об'єднати нові об'єкти з декількох pack-файлів в один більший pack-файл і при необхідності здійснити упаковку та злиття кількох сусідніх шарів інкрементального MIDX-індексу. Подібна стратегія дозволяє при виконанні git repack переписувати тільки верхні шари, залишаючи старі великі шари незайманими, а також виключити неконтрольоване розростання шарів ланцюжка, підтримуючи загальну кількість шарів на рівні, пропорційному логарифму від загальної кількості об'єктів.
- Значно оптимізовано генерацію бітових карт доступності об'єктів за рахунок нового алгоритму обходу дерева об'єктів, що виключає зайву рекурсію, кешування позицій об'єктів, сортування бітових карт до їх об'єднання операцією XOR та переробки коду для створення бітових карт псевдозлиття (pseudo-merge). У тестовому репозиторії оптимізації дозволили скоротити час генерації бітових карток з 612 до 294 секунд.
- Реалізовано можливість паралельного виконання незалежних хуків у конфігураційних файлах. Паралельно не можуть запускатися хуки, що впливають на спільний стан або враховують його, наприклад, що змінюють примітки до комітів або індекси, що інспектують, і робоче дерево. При цьому можна паралельно запускати хуки для перевірки лінтером та виконання unit-тестування. Допустимі паралельне виконання хуки налаштовуються через параметр hook.ім'я_хука.parallel = true. Число робіт, що одночасно запускаються, визначається через налаштування hook.jobs, hook. .jobs або опцію командного рядка -j.
- У команді git pack-objects — path-walk реалізовано можливість вказівки фільтрів, таких як blob:none, blob:limit= , tree:0, object:type= , sparse: та combine:. У проведеному тесті відкидання блобів при виконанні path-walk дозволило на 16% скоротити розмір сформованого pack-файлу.
- Додана команда git format-rev для форматування ревізій та імен об'єктів, що згадуються у списках коммітів або що зустрічаються у довільному тексті (наприклад, можна використовувати у хуках для обробки приміток до коммітів).
git last-modified | git format-rev -stdin-mode=text-format=%an
Junio C Hamano builtin/commit.c
- За замовчуванням увімкнено екранування більшості послідовностей керування терміналом в інформаційних повідомленнях та тексті помилок, що передаються сервером. При зверненні до шкідливого сервера подібні послідовності escape могли використовуватися для приховання або модифікації виводу, наприклад, через escape-послідовності для переміщення курсора і очищення тексту. Залишено підтримку escape-послідовностей для виділення елементів кольором.
- Команда git checkout -m тепер автоматично зберігає конфліктуючі локальні зміни в stash-області без необхідності негайно вирішувати конфлікт.
- До команди git push додано можливість розміщення гілки на кілька зовнішніх Git-серверів однією командою. Наприклад, для передачі гілки main не тільки на основний сервер, а й на дзеркала можна створити групу publish із серверів github, gitlab і mirror:
git config remotes.publish "github gitlab mirror"
git push publish main
- До команди git log -graph додана опція -graph-lane-limit= для обмеження числа вертикальних смуг при візуалізації гілок, що дозволяє залишити місце на екрані під дані про коміти в репозиторіях з великою кількістю гілок.
...
* | | | | 619931f561 Merge branch 'dl/posix-unused-warning-clang'
|\\\\\
| * | | | ~ cf48887610 compat/posix.h: simplify GIT_GNUC_PREREQ() comparison
| * | | | ~ ffd45926dc compat/posix.h: clean up GIT_GNUC_PREREQ() and UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filter pathspec before lstat
- У команди git log і git rev-list додано опцію -max-count-oldest= , що дозволяє вибрати N найстаріших коммітів у діапазоні.
Джерело: linux.org.ru
