LINUX.ORG.RU

Git 2.54

 

Git 2.54

2

2

Представлен релиз распределенной системы управления исходными текстами Git 2.54. Git отличается высокой производительностью и предоставляет средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям «задним числом» используются неявное хеширование всей предыдущей истории в каждом коммите, а также удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов. Код Git распространяется под лицензией GPLv2+.

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

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

  • Реализована команда «git history», предоставляющая экспериментальные возможности для перезаписи истории изменений, более простые и безопасные в использовании, чем перебазирование коммитов командой git rebase. Предоставляются две операции:

    • git history reword <commit> для перезаписи сообщения в указанном коммите без изменения рабочего дерева и индекса (кроме примечания, остальное остаётся нетронутым). Например, для исправления опечатки.
    • git history split <commit> для интерактивного разделения указанного коммита на два разных коммита с перемещением выбранных частей из исходного коммита в дополнительный коммит.

    В будущих выпусках ожидается добавление дополнительных команд: git history fixup для исправления коммита, git history drop для удаления коммита, git history reorder для изменения порядка следования коммитов и git history squash для объединения коммитов.

  • Реализован новый метод определения обработчиков (hook) в файлах конфигурации. Вместо размещения скриптов с обработчиками в каталоге .git/hooks в каждом репозитории, команды для вызова обработчиков теперь можно задавать непосредственно в файлах конфигурации. Настройки можно привязывать к репозиторию или указывать в файлах конфигурации, действующих для всех репозиториев (/etc/gitconfig) или репозиториев пользователя (~/.gitconfig). Возможна привязка нескольких обработчиков к одному событию. Скрипты из .git/hooks по-прежнему продолжают вызываться, но запускаются после обработчиков из файлов кофигурации. Для просмотра списка обработчиков следует использовать команду git hook list, а для выборочного отключения вызова обработчиков – настройку hook.<name>.enabled = false:

[hook "linter"]
   event = pre-commit
   command = ~/bin/linter --cpp20 
    
[hook "no-leaks"]
   event = pre-commit
   command = ~/bin/leak-detector
$ git hook list pre-commit
       global    linter  ~/bin/linter --cpp20
        local    no-leaks    ~/bin/leak-detector 
  • В команде «git maintenance» по умолчанию задействована стратегия geometric (git config set maintenance.strategy geometric), позволяющая сократить время обслуживания крупных монорепозиториев. По сравнению с ранее применяемой стратегией, использующей логику как в команде git gc, новая стратегия избегает переупаковки всех объектов и исключает излишне ресурсоёмкие операции, такие как слияние всех pack-файлов (по возможности объединение производится частями и без чистки удалённых объектов).
  • База данных объектов (ODB) и связанные с ней API переведены на новую архитектуру, основанную на использовании подключаемых бэкендов. Проведённая реструктуризация абстрагирует формат хранения объектов и в дальнейшем позволит реализовать такие возможности, как альтернативные бэкенды и форматы объектов, например, для более эффективного хранения крупных бинарных файлов или для оптимизации работы крупных git-хостингов.
  • В команде «git repo structure», выводящей сведения о структуре репозитория, обеспечено отображение не только общего размера, но и показа самых крупных объектов каждого типа, что позволяет обойтись при оценке размера без использования сторонней утилиты git-sizer.
$ git repo structure
...
| * Largest objects         |             |
|   * Commits               |             |
|     * Maximum size    [1] |   17.23 KiB |
|     * Maximum parents [2] |      10     |
|   * Trees                 |             |
|     * Maximum size    [3] |   58.85 KiB |
|     * Maximum entries [4] |    1.18 k   |
|   * Blobs                 |             |
|     * Maximum size    [5] | 1019.51 KiB |
|   * Tags                  |             |
|     * Maximum size    [6] |    7.13 KiB |
  • В команде «git replay», применяемой вместо git rebase для воссоздания истории на сервере без рабочего дерева, включено по умолчанию атомарное обновление ссылок (вместо вывода списка команд update-ref для ручного выполнения), реализована опция --revert для отмены изменений от серии коммитов, обеспечено отбрасывание результирующих пустых коммитов и появилась возможность воссоздания истории вплоть до корневого коммита.
  • В «git rev-list» и похожие команды добавлена опция --maximal-only для показа только коммитов, недостижимых другими коммитами.
  • В команду «git repo info» добавлена опция --keys для вывода списка всех известных ключей.
  • В команде «git add -p» при навигации между блоками кода при помощи клавиш «J» и «K» обеспечена пометка уже одобренных и пропущенных блоков. Добавлена опция --no-auto-advance для отключения автоматического перехода к следующему файлу, чтобы иметь возможность вернуться к прошлым файлам перед коммитом.
  • Проведена оптимизация web-интерфейса «gitweb» для работы с мобильных устройств.
  • В команде «git apply –directory» перед использованием обеспечена нормализация файловых путей, таких как ./un/../normalized/path.
  • Документирована возможность добавления собственных подкоманд через размещение файлов git-<cmd> в каталоге с исполняемыми файлами.
  • В команду «git send-email» добавлена поддержка клиентских сертификатов.
  • Для команды «git status» реализована настройка status.compareBranches, через которую можно указать ветки, с которыми будет производиться сравнение текущей ветки:
[status]
  compareBranches = @{upstream} @{push}
  • В «git rebase» добавлена опция --trailer для упрощения добавления метаданных ко всем коммитам:
git rebase --trailer "Reviewed-by: Test <test@example.com>"`
  • В команду «git fast-import» добавлена возможность замены подписей для коммитов, которые стали невалидны после импорта.
  • Добавлена поддержка упаковки (compaction) многопакетных индексов MIDX (multi-pack index), при которой между собой объединяются мелкие слои MIDX-индекса c информацией о доступности объектов и связанные с ними bitmap-файлы, что позволяет уменьшить число накопившихся слоёв в давно существующих репозиториях.
  • В команде git backfill реализована возможность указания ревизий (диапазонов коммитов) и масок путей (pathspec) для ограничения загружаемых частей истории изменений:
git backfill main~100..main
git backfill -- '\*.c'
  • Добавлены альтернативные формы вызова команды git config listgit config -l и git config --list.
  • Разрешено использование не-ASCII символов в именах псевдонимов команд, задаваемых в файле конфигурации:
[alias "получить"]
    command = fetch
  • Изменено отображение подписей, у которых истёк срок действия GPG-ключей, но которые были валидны на момент подписания коммита. Подобные подписи теперь отображаются как корректные с примечанием об устаревании ключа (ранее они подсвечивались красным цветом, что создавало впечатление об их некорректности).
  • При обращении к репозиториям по HTTP обеспечена обработка ошибки с кодом 429 (Too Many Requests). Завершившиеся подобной ошибкой запросы теперь рассматриваются не как фатальная проблема, а как временная ошибка, для которой через какое-время следует повторить операцию. Задержка перед повтором задаётся через опцию http.retryAfter, число повторов – http.maxRetries, время ожидания – http.maxRetryTime.

>>> Источник: OpenNET



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

Переработано парсинг

@unclestephen в заморозке, но дело его живёт :)

Шутка. Я могу проверить, но не раньше вечера, может, ещё кто-то из модераторов посмотрит быстрее.

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

ещё кто-то из модераторов посмотрит быстрее.

– Вы - гинеколог?
– Нет, … но посмотреть могу…

После осмотра:

– Может все-таки в реанимацию?
– Врач сказал в морг, значит в морг!

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

Что мешает скопировать

Что ж, мне не помешало. Получи заслуженный 0.

dataman ★★★★★
()

$ git repo structure

На самом git/git показывает:

Counting objects: 411526, done.
| Repository structure      | Value      |
| ------------------------- | ---------- |
| * References              |            |
|   * Count                 |   1.01 k   |
|     * Branches            |      1     |
|     * Tags                |   1.00 k   |
|     * Remotes             |      9     |
|     * Others              |      0     |
|                           |            |
| * Reachable objects       |            |
|   * Count                 | 411.53 k   |
|     * Commits             |  84.22 k   |
|     * Trees               | 164.92 k   |
|     * Blobs               | 161.38 k   |
|     * Tags                |   1.00 k   |
|   * Inflated size         |   7.49 GiB |
|     * Commits             |  57.73 MiB |
|     * Trees               |   2.34 GiB |
|     * Blobs               |   5.09 GiB |
|     * Tags                | 739.37 KiB |
|   * Disk size             | 261.28 MiB |
|     * Commits             |  32.51 MiB |
|     * Trees               |  63.11 MiB |
|     * Blobs               | 165.08 MiB |
|     * Tags                | 584.19 KiB |
|                           |            |
| * Largest objects         |            |
|   * Commits               |            |
|     * Maximum size    [1] |  17.23 KiB |
|     * Maximum parents [2] |     10     |
|   * Trees                 |            |
|     * Maximum size    [3] |  58.85 KiB |
|     * Maximum entries [4] |   1.18 k   |
|   * Blobs                 |            |
|     * Maximum size    [5] |   1.02 MiB |
|   * Tags                  |            |
|     * Maximum size    [6] |   7.13 KiB |

[1] f6ecb603ff8af608a417d7724727d6bc3a9dbfdf
[2] 16d7601e176cd53f3c2f02367698d06b85e08879
[3] 1590ce434b8e816e594b37b96929e5ca7b50f27d
[4] 1590ce434b8e816e594b37b96929e5ca7b50f27d
[5] 867678dcf73f6de0d6e1e8fe198cd3a43771fd74
[6] 07e38db6a5a03690034d27104401f6c8ea40f1fc

[3, 4] 1590ce434b8e816e594b37b96929e5ca7b50f27d
[5] 867678dcf73f6de0d6e1e8fe198cd3a43771fd74
[6] 07e38db6a5a03690034d27104401f6c8ea40f1fc

404 - Page not found

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

Строго говоря, это не дыра. Но аналогия например такая: а давайте пропишем в .bashrc патч Бармина, а затем заявим что это дыра в баше, позволяющая всё удалить. Содержимое .git это такой же локальный конфиг гита, как bashrc - конфиг баша. Всё его содержание предполагается сознательно вписанным туда локальным юзером. Сам git при git init или некоторых других командах тоже может его менять, но вполне детерминированным образом и попадание туда опасных настроек без явного на то указания юзера исключено (если только уязвимость не найдут). На запуск с рандомным вредоносным .git гит не рассчитан.

Но я согласен что поведение несколько опасное т.к. многим оказалось неочевидно что при парсинге рандомного левого файла в качестве конфига гита могут произойти вредоносные события. Впрочем, подозреваю что fsmonitor - не единственный способ произвести что-то незапланированное через подсовывание специального конфига гиту.

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

Ну возможность «неразрушающего» чтения репы бы всё-таки была полезной. Хотя это и не приоритетная штука думаю.

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

Ну возможность «неразрушающего» чтения репы бы всё-таки была полезной

Чего-чего? Пользователь вписал в .git/ зловред, или выполнил какую-то малварь, которая его туда вписала, а потом хочет какого-то «неразрушающего» чтения?

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

Я знаю и пользуюсь от силы 7-8 командами гита типа pull, push, checkout, branch, log, status, commit. Это еще нормально или уже нет?

water_closed
()
Ответ на: комментарий от annulen

Пользователь мог ничего не вписывать и вообще не собирался там гит запускать. Скачал тарболл с исходниками, хотел как раз в emacs-е их проглядеть и проверить что они не вредоносные. То что там директория .git есть - не заметил (а зачем бы ему проверять это заранее?). А вот emacs хочет собрать какую-то информацию о репе, что ему делать? Каждый раз спрашивать у юзера можно ли парсить .git или же он непроверенный?

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

Это не локальный конфиг.

Это конфиг, скачанный из сети, который emacs (и еще куча другого софта) молча выполняет.

Аналогия - имплицитный curl | bash.

И кстати, дыра не теоретическая. https://habr.com/ru/articles/1025624/ - здесь набор софта другой, но вектор атаки идентичный.

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

Всё его содержание предполагается сознательно вписанным туда локальным юзером.

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

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

Я вижу тут сарказм, но хочу сказать, что ПАРСИНГ конфигурации совершенно точно НЕ ДОЛЖЕН приводить к вредоносным событиям. И одно дело - какое-нибудь переполнение, а другое дело - запуск произвольной команды.

Кстати, этот патч в git добавил сотрудник микрософта, что как бы намекает на 1) нужность этой функции 2) неумолимую тягу микрософта к любым формам autorun.inf 3) функциональность для монорепной помойки, на которой помешалась корпоративная разрабока.

liksys ★★★★
()

Реализован новый метод определения обработчиков (hook) в файлах конфигурации.

А как там реализовать мультилайн? Часто нужна логика (особенно если хук глобальный и/или это multi-remote, и нужны дополнительные проверки), как это было в скриптах.

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

туда же можно rm -rf / прописать

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

liksys ★★★★
()

Представлен релиз распределенной системы управления исходными текстами Git 2.54.

Почему именно исходными текстами? Что это вообще такое?

yvv1
()
Ответ на: комментарий от water_closed

pull, push, checkout, branch, log, status, commit

Для обычной повседневной работы должно быть достаточно. Разве что ты забыл еще про merge, rebase, stash.

Остальное - для каких-то особых случаев или решения проблем.

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

Каждый раз спрашивать у юзера можно ли парсить .git или же он непроверенный?

https://zed.dev/docs/worktree-trust

https://code.visualstudio.com/docs/editing/workspaces/workspace-trust

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

Но гит же не обязательно для исходников использовать. Народ вообще для всего что хранится в текстовых форматах использует.

yvv1
()
Ответ на: комментарий от wandrien

Не, аналогия - просто имплицитный bash. Имплицитного curl там нет, гит сам никакие конфиги из сети не скачивает. При git clone конфиг он генерирует сам, и хотя часть этого конфига может зависеть от клонируемой репы, но исключительно безопасным способом. Скаченный конфиг может получиться только если юзер сам его скачает другими инструментами.

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

Речь о том что в конфиг записывается адрес исходной репы, могут указываться имена каких-то веток, и вроде на этом всё. Конфиг клонируемой репы (точнее это даже не конфиг репы, а конфиг гита, её локально использующего) в целом не учитывается.

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

80% самых актуальных команд прекрасно структурированы в официальных визуализаторах от разработчиков git, которые доступны вместе с релизом:

git gui и gitk --all Никакого смысла дергать их из консоли не вижу, так как при худшей визуализации - больше шанс накосячить. Кстати это пример того, что Tk - нормальный для пользователя тулкит, если делать на нём относительно простые визуализации. Tk 9.0 - а git-утилиты ч нис уже совместимы - стал ещё на вид как из 2000х, а не из прошлого века)

Из остальных 20% эпизодичечки пользуюсь в консоли:

  • git clone/git init, потому что они не требуют визуализации - перед командой визуализировать еще нечего
  • git stash сохранение и применение, когда git тупит и отказыается делать что-то хитрое пока есть неконфликтующие с этим хитрым изменения в рабочей копии. Тут имхо баналтная недоработка, он мог бы разрешить это автоматом
  • git checkout . чтоб отменить все изменения, если проект не мой, изменения не планировались, а устроились неожиданным поведенияем скрипта сборки в проекте.
  • git rebase с самыми упоротыми ключами
  • git reflog если осознал что результат завершённого rebase неудачный и надо вернуть как было 10 минут назад с помощью git reset))
  • git submodule в разных вариациях, если по каким-то причинам для CI проще взять другой проект как submodule, а не как пакет. Для меня эта команда сложнее всех, я не до конца понимаю всей её машины состояний с init/update
GPFault ★★★
()
Ответ на: комментарий от Somebody

Ну, я не специалист по гиту, и вообще он мне не нравится, так что точных данных не имею. Но идея то понятна.

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

Да, технически это система управления версиями для любой текстовой информации.

Душнишь, но прав)

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

git add через git gui (который первый упомянут) делаю, интерактивно, чтоб в момент добавления видеть что добавляю

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

Странно что в git для такого нету обхоодного путя, например гипотетический флаг «-H» который бы значил «.git/hooks не читать», и выглядил бы в команде как git -H status

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

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

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

Я не понял, а что происходит с боязнью числа пальцев Линуса, когда релизится Git? Как они аж до 54-х дожили?

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

Но гит же не обязательно для исходников использовать.

Это следствие из термина SCM (source control/code management). Более общие термины - VCS/RCS (version/revision control system).

Народ вообще для всего что хранится в текстовых форматах использует.

и не только текстовые. Ревизии бинарных файлов тоже важны.

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

git reflog если осознал что результат завершённого rebase неудачный и надо вернуть как было 10 минут назад с помощью git reset))

OMG. Достаточно создать дополнительную ссылку на перемещаемую ветку. После успешного rebase - удалить.

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

OMG. Достаточно создать дополнительную ссылку на перемещаемую ветку. После успешного rebase - удалить.

Неудачных ребейзов 1-5%. git reflog - это и есть по сути заранее созданные ссылки на перемещаемые ветки. Проще пользоваться им, чем в вручную создавать ветку, которая не понадобится в 95% случаев. В наиболее ответственных случаях когда не могу на такое положиться - бэкаплю предыдущее состояние ветки на репозитрий на другом хосте (сервер).

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

git reflog - это и есть по сути заранее созданные ссылки на перемещаемые ветки

Которые могут быть зачищены сборщиком мусора в самый неподходящий момент.

В наиболее ответственных случаях когда не могу на такое положиться - бэкаплю предыдущее состояние ветки на репозитрий на другом хосте (сервер).

угу, это ведь проще чем создать доп. ссылку :-)

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

git reflog - это и есть по сути заранее созданные ссылки на перемещаемые ветки

Которые могут быть зачищены сборщиком мусора в самый неподходящий момент.

Я так понимаю что сборщик мусора чистит по времени, недавно ставшее orphan не удалит. Также, насколько я понимаю он не запускается автоматом (в случае git gui - оно эпизодически предлагает его запустить)

В наиболее ответственных случаях когда не могу на такое положиться - бэкаплю предыдущее состояние ветки на репозитрий на другом хосте (сервер).

угу, это ведь проще чем создать доп. ссылку :-)

Если что-то ощущается ответственным - то его бэкап должен идти на другой хост, ибо риски человеческого фактора (удалил не то) и аппаратного (умер диск) начинают быть сопоставимы с риском «почему-то не сработал git reflog». Бэкапы в пределах хоста имеют смысл только если что-то точно запортится, а как средство от редких рисков - не годятся.

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

Я так понимаю что сборщик мусора чистит по времени, недавно ставшее orphan не удалит.

судя по документации prune ориентируется на возраст (age) объекта, а не на дату перехода в orphan. В интернетах пишут, что возраст объекта определяется по mtime файла объекта на файловой системе.

Также, насколько я понимаю он не запускается автоматом (в случае git gui - оно эпизодически предлагает его запустить)

Да вроде как автоматом. И в доках по gc.auto не раз встречается слово heuristic. Поэтому на мой взгляд полагаться в обычной работе на reflog это как хранить важные данные в корзине ;-)

Если что-то ощущается ответственным - то его бэкап должен идти на другой хост, ибо риски человеческого фактора (удалил не то) и аппаратного (умер диск) начинают быть сопоставимы с риском «почему-то не сработал git reflog». Бэкапы в пределах хоста имеют смысл только если что-то точно запортится, а как средство от редких рисков - не годятся.

rebase это вполне себе ежедневная процедура на локальных/приватных ветках. Даже при оценке процента неудач в 1-5%, случится в течение 20-100 дней. Это заметно чаще, чем аппаратные проблемы.

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