Представен е релиз на разпределената система за управление с изходни текстове Git 2.55. Средводените ключови промени включват: включване по подразбиране на компилация с Rust, реализиране на процеса fsmonitor за Linux, нова стратегия за преопакетиране на инкременталния MIDX индекс, команда „git history fixup“ за коригиране на комит, оптимизация на генерирането на битови карти за наличност на обекти, поддръжка на паралелно изпълнение на hook-ове и команда „git format-rev“. Кодът на Git е разпространен под лицензия GPLv2+.
В сравнение с предишното издание, в новата версия са включени 505 промени, подготвени с участието на 100 разработчици, 33 от които за първи път участват в разработката на Git. Основните нововъведения (1, 2, 3):
- По подразбиране е включена поддръжка на компоненти на Rust. Компилаторът rustc
е добавен в категorizирани зависимости за компилация. За компилация без 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, който следи промените в файловата система с помощта на механизма inotify и позволява да се избегне преглеждането на цялата работна директория при изпълнение на команди като „git status“. Активирането се осъществява чрез настройката „core.fsmonitor“.
- В командата «git repack» е добавен режим «—write-midx=incremental», който реализира нова стратегия за обновление на метаданните в инкременталния MIDX индекс (multi-pack index), позволяваща да се заобиколи повторното опаковане на целия индекс. В инкременталния многопакетен индекс вместо един голям индекс, съдържащ информация за разпределението на обектите в pack файловете, се прилага разделяне на слоеве — всеки слой обхваща определен брой pack файлове и се съхранява в отделен битмап файл. Подобна структура позволява добавянето на данни за обектите в новите pack файлове, прикрепяйки нови слоеве към индекса без реконструкция на вече съществуващите слоеве.
Командата «git repack —write-midx=incremental» позволява добавяне на нов слой в инкременталния MIDX индекс, който обхваща наскоро създадените pack файлове. В комбинация с режима за опаковане на репозитории «—geometric», новата команда дава възможност да се обединят нови обекти от няколко pack файла в един по-голям pack файл и при необходимост да се извърши опаковане и сливания на няколко съседни слоя на инкременталния MIDX индекс. Подобна стратегия позволява при изпълнение на «git repack» да се презаписват само горните слоеве, оставяйки старите големи слоеве непокътнати, а също така да се предотврати неконтролираното разрастване на веригата от слоеве, поддържайки общия брой слоеве на ниво, пропорционално на логаритъма от общия брой обекти.
- Генерацията на битови карти на наличността на обектите е значително оптимизирана благодарение на нов алгоритъм за обхождане на дървото на обектите, който изключва излишната рекурсия, кешира позициите на обектите, сортирува битовите карти преди тяхното обединение с операцията XOR и преработва кода за създаване на битови карти на псевдосливане (pseudo-merge). В тестовото хранилище оптимизациите позволиха да се съкрати времето за генериране на битови карти от 612 на 294 секунди.
- Реализирана е възможността за паралелно изпълнение на независими hook-ове във файловете за конфигурация. Паралелно не могат да се стартират hook-ове, които влияят на общото състояние или го отчитат, например, променящи забележките на комитите или инспектиращи индексите и работното дърво. В същото време е възможно паралелно да се изпълняват hook-ове за проверка с линтер и извършване на unit-тестове. Позволяващите паралелно изпълнение hook-ове се настройват чрез параметъра „hook.име_хука.parallel = true“. Броят на едновременно стартираните задачи се определя чрез настройките hook.jobs, hook.<събитие>.jobs или опцията на командния ред „-j“.
- В екипа „git pack-objects —path-walk“ е реализирана възможността за указване на филтри, като „blob:none“, „blob:limit=<n>“, „tree:0“, „object:type=<type>“, „sparse:<oid>“ и „combine:“. В проведен тест отстраняването на блобовете при изпълнение на „—path-walk“ е позволило да се намали размерът на формируемия pack-файл с 16%.
- Добавена е командата „git format-rev“ за форматиране на ревизии и имена на обекти, споменати в списъците с комити или срещащи се в произволен текст (например, може да се използва в hook за обработка на забележките при комитите).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Включено е по Default екранването на повечето контролни последователности за терминала в информационните съобщения и текста на грешките, предавани сървър. При обращение към злонамерено сървъра подобни 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=<N>“ за ограничаване на броя вертикални ленти при визуализация на клоновете, което позволява да се остави място на екрана за данни за комитите в репозиции с голям брой клонове.
…
* | | | | 619931f561 Merge branch ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: опростяване на сравнение GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h: почистване на GIT_GNUC_PREREQ() и UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: филтриране на pathspec преди lstat - В командите «git log» и «git rev-list» е добавена опция «—max-count-oldest=, която позволява да се изберат N-те най-стари комита в диапазона.
Източник: opennet.ru
