Представен е релиз на разпределената система за управление на изходния код Git 2.56. Кодът на Git се разпространява под GPLv2+ лиценз. В новата версия са направени 748 промени, извършени с участието на 104 разработчици, от които 39 за пръв път участват в разработката на Git. Основните нововъведения (1, 2, 3):
- Добавен е режим „git add —resolved“ за разрешаване на конфликти при сливане на клонове, който проверява файловете за наличието на маркери на конфликт и, при откритие на такъв маркер в поне един файл, дава грешка, не индексира нито един от файловете и показва списък с файловете, които трябва да бъдат поправени. За разлика от командата „git add —update“, новият режим обработва само файловете, които са в конфликтно състояние, а променените файлове, които не са свързани с конфликта, се игнорират, което позволява безопасно завършване на сливането, дори ако в работната директория има и други незавършени промени (командата „git add —update“ добавяше в индекса всички преди това проследявани промени в работната директория).
- Значително е ускорена работата с големи хранилища чрез оптимизация на алгоритъма за намиране на последните общи комити при сливане на клонове и сравняване на комити. При работа сега се вземат предвид комитите, принадлежащи единствено на един от клоновете, което позволява спиране на сканирането веднага след откритие на всички възможни общи предци, без да се губи време за по-нататъшен преглед на историята на промените. В едно от тестваните хранилища скоростта на търсене се е увеличила средно 20 пъти, а в друго ускорението е било до 70 пъти. При извършване на командата „git merge-base —all v4.8 v4.9“ в хранилището с ядрото на Linux броят на стъпките за обход е намален от 167 хиляди на 3.8 хиляди.
- За сървърна употреба е адаптиран режимът за пренареждане „—path-walk“, който позволява създаването на по-компактни pack-файлове чрез групиране на обекти по техния път в дървото на каталогите (например, за хранилището Fluent UI използването на „—path-walk“ е намалило размера на pack-файла от 558 МБ на 164 МБ). В новата версия е реализирана възможността за използване на режима „—path-walk“ съвместно с битови карти на достижимостта (reachability bitmap) и дельта-острови (delta island), използвани от git-хостингите за ускоряване на работата и изолация на форковете от основното хранилище.
- Преодолени са тесните места, водещи до излишни изчисления в големи хранилища: изключени са ненужните проверки на състоянието на файловете при запис в reftable; избегнато е повторното сканиране на списъка при всяко вмъкване на нов pack-файл; ускорени са операциите с reftable, в които се е натрупало много записи за удаление; оптимизирана е работата на „git diff“ при задаване на ограничения по файлови пътища. След оптимизациите, работата с reftable при голям брой изтривания се е ускорила 65 пъти (от 13 секунди до 0.2 секунди), а изпълнението на проблемната команда „git diff“ в хранилището Chromium с 500000 елемента в индекса започна да отнема 0.07 секунди вместо 8 минути.
- В експерименталния екип «git history», предоставящ възможности за преизписване на историята на промените, е добавена операцията «git history drop» за изтриване на избран commit с автоматично прикрепване на неговите наследници към родителския commit.
- Добавена е командата «git branch —delete-merged ‘origin*’ ‘topic-*'» за безопасно изтриване на групи локални клонове, чийто промени вече са предадени на външно хранилище. За филтриране на клонове и хранилища е позволено използването на маски. За анализ на кандидатите за изтриване, без действително изпълнение на операцията, може да се използва флагът «—dry-run».
- Добавена е командата «git refs create|update|delete|rename», в която са обединени нискоуровневите операции за създаване, изтриване, преименуване и актуализиране на референции.
- В командата «git bisect run» е добавена опцията «—reset-when-found=[]», която автоматично възстановява хранилището в състояние преди започване на търсенето или оставя активен проблемния commit, без да е необходима отделна команда «git bisect reset».
- В командата «git replay» е добавен флагът «—linearize» за използване на плоска топология на сливане, аналогично на «git rebase —no-rebase-merges», но без достъп до работното дърво.
- В командата «git log —follow» е реализирано проследяване на преименования на файлове в нелинейна история на промените, например, при сливане на подклони. Пътят до файла сега се фиксира отделно за всеки родителски commit, което прави резултата независим от реда на обхода на историята на commit-ите.
- Добавена е възможността за прилагане на командата «git repack -a —filter=blob:limit=1m —drop-filtered» за премахване на големи blob обекти, които са заредени при поискване от външен репозиторий и не се използват в текущия индекс. При последващ достъп до тези обекти те ще бъдат автоматично заредени отново.
- В командата «git log —graph» за графи с множество независими корени е реализирано добавяне на отстъпи за ясно разграничаване на несвързани комити.
- Гарантирано е откриването на типични печатни грешки, като указание «git push origin/main» вместо «git push origin main» или «git branch —set-upstream-to origin main» вместо «git branch —set-upstream-to=origin/main», и се извежда подсказка за използване на правилната версия.
Източник: opennet.ru
