LINUX.ORG.RU

Git 2.51

 , , ,

Git 2.51

0

2

18 августа, после двух месяцев разработки, состоялся выпуск 2.51 распределённой системы управления исходными текстами Git.

По сравнению с прошлым выпуском в новую версию принято 506 изменений, подготовленных при участии 91 разработчика (21 впервые приняли участие в разработке Git).

Основные новшества:

  • Повышена производительность команд git push и git fetch в репозиториях с большим числом ссылок. Ускорение обеспечено за счёт обновления ссылок в пакетном режиме, в котором в одной транзакции обрабатывается сразу несколько ссылок, вместо создания отдельной транзакции для обновления каждой ссылки. Оптимизация существенно увеличила скорость работы бэкенда reftable, которые теперь обгоняет по производительности бэкенд files Например, в тестовом репозитории с 10 тысячами ссылок производительность git fetch при использовании бэкенда reftable увеличилась в 22 раза, а при использовании бэкенда files – в 1.25 раза. Для git push прирост составил 18 и 1.21 раза, соответственно.
  • Предложен новый метод упаковки в pack-файлах частей репозитория, не связанных с отслеживанием недостижимых объектов, на которые в репозитории отсутствуют ссылки (не ссылаются ветки или теги). Информация о недостижимых объектах хранится в отдельных pack-файлах («cruft packs»), что приводило к необходимости их отражения в многопакетных индексах MIDX («multi-pack index») для охвата объектов, которые изначально были недостижимы и хранились только в cruft-пакете, но затем стали достижимы после ссылающегося на них коммита.
    В новой версии при переупаковке pack-файлов обеспечено сохранение дополнительных копий достижимых объектов, хранимых только во cruft-файлах. Подобное изменение гарантирует, что в наборе pack-файлов, используемых для хранения достижимых объектов, не содержится объектов, ссылающихся на другие объекты, хранимые вне этого набора. Для исключения из многопакетных индексов (MIDX) недостижимого содержимого cruft-файлов предложена настройка repack.MIDXMustContainCruft, позволяющая заметно сократить размер подобных индексов. Включение настройки в репозитории GitHub позволило сократить размер MIDX-индексов на 38%, ускорить запись в MIDX-индексы на 35% и повысить производительность чтения на 5%.
  • В команду git pack-objects добавлена опция --path-walk, включающая новый метод сбора информации об объектах при переупаковке pack-файлов. Вместо обхода объектов в порядке ревизий, при использовании режима --path-walk объекты перебираются через обход файловых путей, что позволяет разом упаковывать все объекты с одним и тем же файловым путём. Подобный подход даёт возможность исключить эвристику, использующую хеширование для определения связи объекта с его файловым путём, а также избавиться от сортировки объектов перед упаковкой. При использовании режима --path-walk размер генерируемых pack-файлов получается значительно меньше, чем при группировке объектов при помощи хешей.
  • Определён формат для обмена сохранёнными состояниями рабочего дерева и индексов в репозитории, создаваемыми при помощи команды git stash. Новый формат позволяет кодировать сохранённые изменения (stash-записи) в виде последовательности коммитов. Для импорта и экспорта предложены подкоманды git stash import и git stash export, которые можно использовать для переноса сохранённых состояний с одной системы на другую и выполнения операций push или pull с этими состояниями как с обычными ветками или тегами.
  • В команде git cat-file, выводящей содержимое заданных объектов, при использовании опций --batch и --batch-check реализована возможность отображения информации об отсутствующих объектах (например, из-за повреждения репозитория) и субмодулях. Ранее при указании пути у субмодулю команда git cat-file --batch-check выводила «missing», а теперь покажет идентификатор объекта.
  • В команде git log задействованы оптимизации на основе фильтров Блума для ускорения поиска в истории изменений при указании фильтров с несколькими файловыми путями, например, git log -- path/to/a path/to/b.
  • Стабилизированы команды git switch и git restore, которые с 2019 года рассматривались как экспериментальные. Команды преподносятся как современные эквиваленты git checkout, разделяющие такие малосвязанные возможности данной команды, как манипуляция ветками (переключение и создание) и восстановление файлов в рабочем каталоге.
  • Объявлена устаревшей и намечена к удалению в ветке Git 3.0 команда git whatchanged, эквивалентная git log --raw.
  • В команду git for-each-ref добавлена опция --start-after, которая может применяться совместно с опцией --count для организации постраничного вывода.
  • В команды git merge и git pull добавлена опция --compact-summary для использования компактного формата сводной информации об изменениях вместо формата diffstat.
  • В кодовой базе Git разрешено использование ключевого слова bool, появившегося в стандарте C99. Также документированы некоторые возможности C99, экспериментально используемые в Git (например, в середине 2026 года планируют разрешить применение конструкций (struct foo){ .member = value };). Компилятор с поддержкой C99 является обязательным для Git c 2021 года, но возможности спецификации C99 внедряются крайне осторожно для сохранения совместимости с компиляторами, лишь частично поддерживающими данный стандарт.
  • В правила приёма патчей внесены изменения, разрешающие отправку патчей под псевдонимом, а не только под настоящим именем разработчика. Изменение соответствует правилам приёма патчей в ядро Linux.
  • Обновлён список нарушающих совместимость изменений, которые будут применены в ветке Git 3.0. Из значительных изменений в предстоящем выпуске Git 3.0 отмечается переход по умолчанию на идентификаторы объектов на основе алгоритма хеширования SHA-256 при инициализации новых репозиториев и задействование формата reftable для хранения в репозитории ссылок на ветки и теги (задействовано блочное хранилище от проекта JGit, оптимизированное для хранения очень большого числа ссылок).

>>> Подробности на opennet

★★★★★

Проверено: hobbit ()

Ускорение обеспечено за счёт обновления ссылок в пакетном режиме, в котором в одной транзакции обрабатывается сразу несколько ссылок, вместо создания отдельной транзакции для обновления каждой ссылки.

Ждём очередной CVE

xDShot ★★★★★
()
Ответ на: комментарий от dataman

Я не против, просто не совсем понятно, что то добавили а что то нет. Или все перечисляем или ничего.

mx__ ★★★★★
()

Кто сейчас гит развивает? Всё еще пинус штурвальтс, или основные уже иные?

I-Love-Microsoft ★★★★★
()

А докачку паков так и не допилили
как мне качсать если ТСПУ режет соединение каждые 16 кб сеть не может передать пак целиком?

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от mittorn

Докачки паков не будет.

Пробуй:

git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

На счёт postBuffer’а не уверен, но хуже не будет.

Можно буфер для приёма задать, но тоже не должно влиять:

git config --global http.maxRequestBuffer 100M

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 2)

Функциональность, которую видимо никогда не добавят в Git:

  • Возможность отдельной правки COMMITMSG без изменения хешей коммитов. Помогло бы исправлять опечатки и дополнять историю коммитов заметками и более подробным описанием без ломания всей совместимости с форками.
  • Возможность добавления в Git пустых каталогов, это очень полезно для обозначения начальной структуры проекта и её последующего расширения. Файлики типа .gitkeep и пр. ReadMe.md в каждой директории выглядят костыльным решением.
  • Хотелось бы, чтобы при git clone/pull/fetch и прочих сетевых обращений работала «докачка» и проверка целостности ответа. На нестабильных сетевых соединениях клонирование репозитория это сущий ад. Имел счастье несколько лет назад пару недель поработать на GPRS/EDGE соединении в труднодоступном для цивилизации месте, склонировать крупные репозитории получалось лишь раза с 10-го.
EXL ★★★★★
()
Ответ на: комментарий от EXL

Возможность отдельной правки COMMITMSG без изменения хешей коммитов. Помогло бы исправлять опечатки и дополнять историю коммитов заметками и более подробным описанием без ломания всей совместимости с форками.

Хм. Я использую последние лет 10 ссылки на систему трекинга задач. В сообщении коммита в том или ином виде упоминается номер задачи, в котором уже можно прочитать полное ТЗ и комментарии по реализации.

Я так понимаю, что нынче это стандарт де-факто. Можно, наверное, спорить, но меня такой формат работы пока полностью устраивал.

Возможность добавления в Git пустых каталогов, это очень полезно для обозначения начальной структуры проекта и её последующего расширения. Файлики типа .gitkeep и пр. ReadMe.md в каждой директории выглядят костыльным решением.

Выглядит не особо критичным костылём. Костыли будут всегда, меня конкретно этот не сильно напрягают.

Я так понимаю, его существование - следствие того, как Git хранит историю (только файлы), потому вряд ли когда-нибудь будет исправлено.

Хотелось бы, чтобы при git clone/pull/fetch и прочих сетевых обращений работала «докачка» и проверка целостности ответа. На нестабильных сетевых соединениях клонирование репозитория это сущий ад. Имел счастье несколько лет назад пару недель поработать на GPRS/EDGE соединении в труднодоступном для цивилизации месте, склонировать крупные репозитории получалось лишь раза с 10-го.

Увы, большинство разработчиков сидит на широких каналах, и вообще не задумываются о проблемах узких каналов. Не только в Git, а везде вообще.

Стоит приехать куда-нибудь в Индию, или другую подобную страну, и там работа превращается в пытку.

Когда ещё был Slack в ходу, можно было минут 20-30 отправлять простое текстовое сообщение типа: «Hello, how are you». Ему реально требовался канал от мегабита, чтобы обмениваться текстовыми строками не длинее 80-100 байт.

Chiffchaff
()
Ответ на: комментарий от EXL

Возможность добавления в Git пустых каталогов

Было бы так же неплохо, чтобы удалялись каталоги ставшие пустыми.

YogSagot ★★☆
()
Ответ на: комментарий от LamerOk

Есть какие-то причины невозможности реализовтаь докачку паков? В большинстве случаев качается пак, который уже лежит в кэше на сервере - то есть я проблем кроме лени разрабов не вижу. Если они так хотят уменьшить нагрузку от повторных запросов при не удаче - то вместо этого пользовалети вынуждены качать с нуля в ещё большее количество попыток - что явно серверу не поможет

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 2)
Ответ на: комментарий от EXL

Что касается истории. Хуже всего, если какой-нибудь джун засунет когда-то в историю гигантские бинарные файлы, venv python, скомпилированный байткод, или всю прочую шнягу, которая генерится из исходников и не должна попадать в VCS, то это будет вечно храниться в репе, даже после удаления. Или мы получим, что все форки сломаны.

Есть проекты, которые начинали джуны. Сам проект весит 200 Кб, а история Git, которая хранится и передаётся при каждом clone - весит сотни Мб, из-за какого-нибудь джуновского недосмотра в самом начале.

Chiffchaff
()
Ответ на: комментарий от YogSagot

git вообще хоть что-нибудь про каталоги знает?

mittorn ★★★★★
()
Ответ на: комментарий от Chiffchaff

Есть filter-branch и аналоги.
Да, хэши нарушается. Но если сделать возможность переписать историю без изменения хэша, это возможно будет источником дыр и беспорядка - всё равно о таких вещах надо предупреждать всех работающих с репозиторием

mittorn ★★★★★
()

Что лично меня бесповоротно раздражает в Git - это необходимость постоянно разрешать конфликты. При работе в команде, с несколькими релизными ветками, с долгими ревью, ты будешь постоянно ребейсить или мержить, и это постоянно будет приводить к конфликтам.

Хуже всего, что один и тот же примитивный конфликт придётся разрешать десятки раз. rerere не помогает (м.б. только в каких-то совсем тривиальных случаях).

Это вот прям:

а) реально бесит

б) приводит к настоящим ошибкам, потому что очень сложно 50 раз сделать ручной мерж, и ни разу не ошибиться.

Chiffchaff
()
Ответ на: комментарий от mittorn

Есть какие-то причины невозможности реализовтаь докачку паков?

Да, нахерненужность. Гит не решает проблемы сломанной сети или сломанного носителя информации, гит решает задачи версионирования и контроля целостности на исправном оборудовании.

то есть я проблем кроме лени разрабов не вижу

А разрабы не видят проблемы у тебя кроме твоей лени поменять сломанную сеть на нормальную.

LamerOk ★★★★★
()
Ответ на: комментарий от Chiffchaff

Я именно про редактирование текстовых заметок коммитов отдельно от хешей самих коммитов и их содержимого в виде текстовых или бинарных файлов и патчей на них.

Поэтому всё что смог бы сделать джун – это добавить какое-то некорректное описание коммиту.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Функциональность, которую видимо никогда не добавят в Git:

Возможность отдельной правки COMMITMSG без изменения хешей коммитов

А "опечатки" в исходинках без правки подписи ты поменять случайно не хочешь?

пустых каталогов, это очень полезно

Я даже затрудняюсь представить себе, что может быть полезнее пустых каталогов? Абсолютно необходимая вещь в хозяйстве!

Хотелось бы, чтобы при git clone/pull/fetch и прочих сетевых обращений работала … проверка целостности ответа.

Какой сюрпирз, она уже!

LamerOk ★★★★★
()
Ответ на: комментарий от YogSagot

удалялись каталоги ставшие пустыми.

git clean -fd

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Я даже затрудняюсь представить себе, что может быть полезнее пустых каталогов? Абсолютно необходимая вещь в хозяйстве!

Да, полезная. Для того, чтобы наметить и набросать первоначальную структуру проекта, а сами файлы положить туда уже позже.

SVN, CVS в отличие от Git’а умеют работать с пустыми каталогами:

https://www.gnu.org/software/trans-coord/manual/cvs/html_node/From-scratch.html

Какой сюрпирз, она уже!

Но не докачка. Доходило до смешного – скачать TGZ/ZIP архив проекта с GitHub’а размером в 50 МБ я мог без проблем, а сделать git clone такого же размера этого же проекта не мог.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

наметить и набросать первоначальную структуру проекта,
сами файлы положить туда уже позже

Это какой-то новый архитектурный паттерн разработки? Directory based development?

SVN, CVS в отличие от Git’а умеют работать с пустыми каталогами:

Ну так и пользуйся ими! Откажись от гит - он тебе не подходит и не решает твоих задач.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

А может это ты нену...
Я говорю о реальной причине. Её здесь нет
На деле же сеть может быть и не сломанная, а просто медленная. А популярные хостинги гита сейчас очень любят закрывать соединения через час-другой
И да, делать вместо докачки пака unshallow - дикий костыль, который поможет только если повезёт и там нет ооогромного объекта в неподходящем месте

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

и не сломанная, а просто медленная
А популярные хостинги гита

То есть проблема не в гите, а в том, что ты через голубей работаешь с гитхабом, которому на тебя и твою сеть насрать, но исправлять твои проблемы должны разработчики гита?

Продолжай ждать, надеяться и "не видеть проблемы".

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Это какой-то новый архитектурный паттерн разработки? Directory based development?

Это здравый разум – сперва подумать, сделать и потом заполнить.

Ну так и пользуйся ими! Откажись от гит - он тебе не подходит и не решает твоих задач.

Давай ты не будешь говорить чем мне пользоваться, а я не буду говорить куда тебе идти.

Если мне не хватает какой-то функциональности в Git, это не значит что Git плох, а значит что он может быть ещё лучше.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Давай ты не будешь говорить чем мне пользоваться,

Я всего лишь предлагаю тебе решение насущной для тебя проблемы.

значит что он может быть ещё лучше.

Нет, не может. Пустых директорий в гите не будет.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

В смысле? Вообще то там есть какой файл с конкретным именем который ты распихиваешь по дирам если она пустая. Вроде это по умолчанию все делают.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от LamerOk

которому на тебя и твою сеть насрать, но исправлять твои проблемы должны разработчики гита?

Так в том-то и прикол, что срать-то как раз разработчикам Git’а, потому что архивы с самого GitHub’а скачивались без проблем с докачкой, в отличие от git’овских clone (pack-файлы).

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

архивы с самого GitHub’а скачивались без проблем

Всё верно, там поддерживается докачка.

в отличие от git’овских clone

Всё верно, там не поддерживается и не будет.

срать-то как раз разработчикам Git’а

Строго говоря, на проблемы голубиного интернета срать примерно всему человечеству. Разработчики гита - лишь их крошечная часть.

LamerOk ★★★★★
()
Ответ на: комментарий от EXL

Хотелось бы, чтобы при git clone/pull/fetch и прочих сетевых обращений работала «докачка»

Аааа это вообще сущий идиотизм. Система предназначеная для инкрементального трекинга изменений, не может инкрементально скачаться. Это прям косячище

bdrbt
()
Ответ на: комментарий от EXL

Можно положить в директории пустые файлы, или написать скрипт, который эти директории создаст. Возможно поддержка пустых дир чревата какими-нибудь костылями в гите, вот и не добавляют? К тому же есть обходные пути.

lv ★★
()
Ответ на: комментарий от EXL

Возможность отдельной правки COMMITMSG без изменения хешей коммитов. Помогло бы исправлять опечатки и дополнять историю коммитов заметками и более подробным описанием без ломания всей совместимости с форками.

Ну да, какой-нибудь новый член команды исправит мой коммит мессадж, и потом иди доказывай, что это не я написал.

seiken ★★★★★
()
Ответ на: комментарий от LamerOk

на проблемы голубиного интернета срать

а я прочитал как «глубинного интернета»…

seiken ★★★★★
()

Для импорта и экспорта предложены подкоманды git stash import и git stash export

А вынести коммиты в ветку tmp/something чем хуже?

kaldeon
()

Стабилизированы команды git switch и git restore, которые с 2019 года рассматривались как экспериментальные.

Есть ли смысл переходить, если используется только сброс файлов, переключение веток и checkout -B?

kaldeon
()
Ответ на: комментарий от Chiffchaff

Я не хочу сказать «Ешьте бриошь», но

  • Правильно ли распределена работа (действительно ли поставленные задача атомарны) между разработчиками, если они постоянно мешают друг другу?
  • Почему у вас долгие ревью?
  • Если у вас долгие ревью, то почему разработчик, который проходит ревью, не подливает регулярно изменения из целевой ветки к себе?
X-Pilot ★★★★★
()
Ответ на: комментарий от X-Pilot

Если у вас долгие ревью, то почему разработчик, который проходит ревью, не подливает регулярно изменения из целевой ветки к себе?

Подливает. И постоянно приходится решать конфликты, ибо пока ты что-то у себя делаешь, на другой стороне уже что-то происходит.

Я лично часто сталкиваюсь с конфликтами, но они все простые. Чаще всего — какой-то единый реестр переменных/констант или однотипных вызовов. diff3 помогает лучше понять источник конфликта.

kaldeon
()
Ответ на: комментарий от X-Pilot

Если у вас долгие ревью, то почему разработчик, который проходит ревью, не подливает регулярно изменения из целевой ветки к себе?

Привет, ручной merge. Круг замкнулся.

Chiffchaff
()
Ответ на: комментарий от LamerOk

Не раз встречал когда огромный репозиторий на идеальной сети, а иногда даже в локальной корпоративной сети, прерывался. Я всегда доходил до 60-70 с какой то репой, а потом гигабайты заново

Соглашусь что да, редко где такое надо. Но порой приходилось качать на другой машине в другом уровне сети, а потом архивом перевозить на локальный

I-Love-Microsoft ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.