|
Представлен релиз распределенной системы управления исходными текстами 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" для удаления выбранного коммита с автоматическим прикреплением его потомков к родительскому коммиту.
- Добавлена команда "git branch --delete-merged 'origin/*' 'topic-*'" для безопасного удаления групп локальных веток, изменения из которых уже переданы во внешний репозиторий. Для фильтрации веток и репозиториев допускается использование масок. Для анализа претендентов на удаление, без фактического выполнения операции, можно использовать флаг "--dry-run".
- Добавлена команда "git refs create|update|delete|rename", в которой объединены низкоуровневые операции для создания, удаления, переименования и обновления ссылок.
- В команду "git bisect run" добавлена опция "--reset-when-found=[<where>]", которая автоматически возвращает репозиторий в состояние до начала поиска или оставляет активным проблемный коммит, без необходимости отдельного запуска команды "git bisect reset".
- В команду "git replay" добавлен флаг "--linearize" для использования плоской топологии слияния, по аналогии с "git rebase --no-rebase-merges", но без обращения к рабочему дереву.
- В команде "git log --follow" реализовано отслеживание переименования файлов в нелинейной истории изменений, например, при слиянии подветок. Путь к файлу теперь фиксируется отдельно для каждого родительского коммита, что делает результат независимым от порядка обхода истории коммитов.
- Добавлена возможность применения команды "git repack -a --filter=blob:limit=1m --drop-filtered" для удаления больших blob-объектов, загруженных на лету (on demand) из внешнего репозитория и не используемых в текущем индексе. При обращении к этим объектам в дальнейшем они будут автоматически повторно загружены.
- В команде "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", и вывод подсказки по использованию корректного варианта.
|