The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск распределенной системы управления исходными текстами Git 2.22

08.06.2019 12:02

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

По сравнению с прошлым выпуском в новую версию принято 745 изменений, подготовленных при участии 74 разработчиков, из которых 18 впервые приняли участие в разработке. Основные новшества:

  • Доступный начиная с выпуска 1.18 новый режим переноса набора коммитов "git rebase --rebase-merges" заменил собой старую опцию "--preserve-merges", которая теперь помечена как устаревшая. Операция "git rebase" применяется для замены серии коммитов на новый базовый коммит, например, для сдвига отдельной ветки, в которой развивается какая-то новая возможность, к актуальному состоянию master-ветки, включающей исправления, добавленные после ответвления:
    
                    o --- o --- o (my-feature)
    
                  /
    
    o --- o --- o --- o --- o (master)
    
    
                                o --- o --- o (my-feature)
    
                              /
    
    o --- o --- o --- o --- o (master)
    

    Для сохранения структуры ветвления в переносимой ветке ранее могла применяться опция "--preserve-merges", которая при запуске в интерактивном режиме (git rebase -i --preserve-merges) позволяла редактировать историю коммитов, но не гарантировала полное сохранение структуры репозитория. Пришедший на смену режим "--rebase-merges" позволяет сохранить структуру изменений в переносимой ветке, предоставляя при этом полный набор интерактивных операций, включая удаление, перегруппировку и переименование коммитов.

    Например, "--rebase-merges" позволяет перезалить коммиты из отдельной ветки на более новую master-ветку, сохранив при этом структуру ветвления в переносимой ветке, и внести на ходу некоторые изменения в примечания к коммитам.

  • Добавлена поддержка создания новой ветки на основе результата определения базы слияния двух других веток (merge base, привязка к общему предку) при помощи конструкций "git branch new A...B" и "git checkout -b new A...B", в которых "A...B" подразумевает определение базы слияния между двумя указанными коммитами, по аналогии с тем, как "git checkout A...B" смещает HEAD на базовый коммит и "diff A...B" показывает изменения между коммитом "B" и общим с коммитом "А" предком.

    Например, при работе над отдельной веткой my-feature предложенную возможность можно использовать когда требуется начать с другой ветки, например, с того же места в master-ветке, с которого была извлечена ветка my-feature. Ранее для этого требовалось вручную изучить лог изменений, что создавало неудобство при наличии большой истории изменений, затем выполнить "git merge-base master my-feature" для вычисления хэша базы слияний между ветками master и my-feature и создать новую ветку относительно общего предка "git branch my-other-feature хэш". В Git 2.22 для создания ветки относительно базы слияния двух других веток можно использовать синтаксис "git branch my-other-feature A...B";

  • Добавлена опция "git branch --show-current" для отображения имени ветки, полученной при выполнении операции checkout;
  • Добавлена опция "git checkout --no-overlay -- dir", позволяющая при выполнении операции checkout привести содержимое каталога dir к виду, полностью соответствующему состоянию master-ветки. Например, если в локальной копии каталога dir имеется файл, отсутствующий в master-ветке, то по умолчанию при выполнении "git checkout master -- dir" он будет оставлен, а при указании опции "--no-overlay" удалён;
  • В команде "git diff" задействован универсальный API для разбора опций, что позволило унифицировать обработку опций с другими утилитами git. Например, в "git diff" для всех опций теперь доступны и их антагонисты ("--function-context" и "--no-function-context");
  • Добавлена возможность фильтрации при выводе "git log" прикреплённых к коммитам расширенных меток ("trailer" - дополнительные информационные флаги, такие как Signed-off-by и Co-authored-by). Возможна фильтрация меток как по ключу, так и по значению, например: "git log --pretty="%(trailers:key=Reviewed-by,valueonly)";
  • Добавлен новый механизм трассировки Trace2, предлагающий более гибкий и структурированный формат вывода. Trace2 позволяет собирать телеметрию о выполняемых операциях и данных о производительности для более детального анализа и отладки (обработчик назначается пользователем, никакие данные не отправляются вовне);
  • Сделан более читаемым отчёт "git bisect", в котором теперь более наглядно выделяются проблемные коммиты и выводятся сводная статистика по изменениям для каждого файла (на уровне числа изменённых строк);
  • Переработана эвристика определения переименований каталогов с целью исключения ложной установки меток переименования. При наличии сомнений подобные каталоги теперь помечаются конфликтующими;
  • Обеспечен вывод предупреждения при попытке установки тега на другой тег, что, как правило, совершается по ошибке и может привести к установке метки не на тот коммит (например, конструкция вида "git tag -f -m "updated message" my-tag1 my-tag2" приведёт к созданию тега на старый тег, в то время как разработчик рассчитывал, что новый тег будет установлен на коммит, на который указывает старый тег);
  • Включена генерация для репозиториев битовых карт (дисковая структура "reachability bitmaps"), сохраняющих данные о наборах объектов, доступных для каждого коммита, и позволяющих быстро определить наличие базового объекта. Указанная структура заметно сокращает время выполнения операций извлечения данных (git fetch).


  1. Главная ссылка к новости (https://github.blog/2019-06-07...)
  2. OpenNews: Зафиксирована атака вредоносных шифровальщиков на Git-репозитории (дополнено)
  3. OpenNews: Выпуск распределенной системы управления исходными текстами Git 2.21
  4. OpenNews: Проект LLVM ввёл в строй официальное Git-зеркало в ходе миграции с SVN
  5. OpenNews: Выпуск распределенной системы управления исходными текстами Git 2.20
  6. OpenNews: Взлом аккаунта на Github привёл к модификациии ПО криптовалюты Syscoin
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/50831-git
Ключевые слова: git
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (27) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, segesg (?), 14:46, 08/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Народ, какой максимальный размер репы git с которой вам приходилось работать?
    У меня на 10Gb начинал притормаживать.
     
     
  • 2.2, Аноним (2), 15:01, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Просто для информации: по опыту, на винде работает на порядки медленнее, чем на линуксе. Возможно, проблема может быть в этом.
     
     
  • 3.3, Иваныч (??), 16:46, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Там где есть много внешних вызовов падение производительности весьма заметное. Я недавно заменил tr, который использовался для проведения всего в нижний регистр, на встроенную команду от bash и прирост был около 2-х раз. Тоже касается команд для определения имени и деректории, в итоге скорость sh скрипта стала сопоставима с Linux окружением. С 15-ти минут к 20 секундам, в соотношении с 15 секундам на Linux.  
     
  • 2.4, Додо (?), 20:49, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А на кой вам 10 гигабайт хранить в репозитории?
    Если он увеличился до подобных размеров - наверное, есть смысл разбить на несколько отдельных репозиториев?
     
     
  • 3.6, Аноним (6), 23:36, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Не знаю как у топик стартера, но я видел уникомов, которые хранили с vcs результаты компиляции (объектники, exe-шники и пр.). Для небольших проектов размеры репы доходили до 300-500 мегабайт.
     
     
  • 4.19, Аноним (19), 21:39, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А сожалению есть популярные репозитории, хранящие всю многогиговую историю. По-моему, единственное, что тут нужно сделать - это заморозить кодовую базу в смысле "не принимаем новые фичи в этот репозиторий", отребейзить все неслитые ветки, включая PR, на macter, пофиксить, перезаписывая историю, после чего cкопировать рабочую копию в новую папку и создать новый репозиторий. Старый переименовать в old-0, в initial commite  дат ссылку на него. Пересоздать все ветки. Должно сильно уменьшить объём.
     
     
  • 5.23, Аноним (23), 02:10, 10/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Если нужно отделить "старую" историю от "текущей" истории,
    то можно воспользоваться способом из книги Pro Git (https://git-scm.com/book/en/v2).
    Способ описан в главе о команде Replace.
     
  • 5.25, Аноним (25), 19:07, 10/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Зачем терять историю? Пускай себе лежит. Можно просто при клонировании глубину указывать, чтобы не тянуть ненужное.
     
     
  • 6.26, Аноним (26), 12:09, 11/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Можно просто при клонировании глубину указывать, чтобы не тянуть ненужное

    Это всё рано стянет ненужное, если хоть маленький кусочек старья по-прежнему используется.

     
     
  • 7.27, Аноним (27), 14:40, 15/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Стянет ровно столько, сколько попросишь, не больше и не меньше. Иди читай, как git работает.
     
  • 2.5, Линус (?), 20:57, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    .gitignore в помощь
     
  • 2.7, segesg (?), 23:42, 08/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Минусующие такие минусующие)
    Мусора в репе нет, про ингнор в курсе
    С Windows не работал уже лет 10 наверное
    Делить по ряду причин неудобно, там другие проблемы вылазят
    Видимо тут никто с реально большими репами не работал, ну да ладно
     
     
  • 3.8, KonstantinB (ok), 00:22, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Да понятно что будет тормозить.

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

     
  • 3.9, Crazy Alex (ok), 00:27, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну порядка гига репа совершенно нормально себя чувствует... правда, на ssd. С бОльшими не работал.
     
     
  • 4.13, без имени (?), 12:24, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    скорее всего ключевое слово здесь SSD - аналогично 12 гигов репа (размер .git директории) работает нормально на SSD, на харде эта же репа заметно притормаживает на больших операциях
     
  • 2.10, Аноним (27), 08:17, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Не понял — репа 10Г или отдельно взятый срез 10Г? Если второе, ты явно что-то делаешь не так. Если первое — не припоминаю, чтобы с таким сталкивался, но в пределах 1-2Г тормозов не наблюдал (хотя в тех случаях тоже многое делалось не так).
     
  • 2.11, .anonymous (?), 11:01, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Под "репой" имеется в виду ".git" или содержимое репозитория на последнем commit-е? Если первое, и если я правильно помню (но могу ошибаться), то гигов 100. Работало нормально.
     
     
  • 3.20, segesg (?), 22:54, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Во, это уже тема!
    Речь про сумму .git и полного чекаута - т.к. с репой надо ещё и работать.
    Можно поинтересоваться сколько примерно в вашей репе объектов, сколько времени длится коммит и rebase, и сколько клиентов тянет сервер?
     
     
  • 4.24, Аноним (27), 08:35, 10/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Речь про сумму .git и полного чекаута - т.к. с репой надо ещё и работать.

    Соотношение-то какое? Если у тебя там огромные объекты, git будет тормозить, потому что он так устроен, а ты используешь его не по назначению. Если просто очень много объектов в истории, особых тормозов быть не должно.

     
  • 2.15, all_glory_to_the_hypnotoad (ok), 17:19, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Около 40GiB, залитая в Git svn-помойка. И, конечно же, на таких объёмах он хорошо не работает.
     
     
  • 3.16, all_glory_to_the_hypnotoad (ok), 17:30, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну и скорость работы в большей степени зависит от кол-ва объектов репозитории и в индексе
     

  • 1.12, Аноним (12), 12:19, 09/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Git LFS https://git-lfs.github.com/
     
     
  • 2.18, Аноним (19), 21:32, 09/06/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Не взлетел, ибо костыль.
     
     
  • 3.21, Аноним (27), 00:24, 10/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Однако ж получше других костылей типа fedpkg.
     

  • 1.14, Аноним (14), 13:25, 09/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Годнота, спасибо!
     
  • 1.17, Аноним (19), 21:32, 09/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Когда уже на sha256 перейдут?
     
     
  • 2.22, Аноним (27), 00:25, 10/06/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Добавлена опциональная возможность применения алгоритма хэширования SHA-256 вместо скомпрометированного SHA-1 при сборке Git в режиме "NewHash". Код для обхода дерева объектов изменён с учётом того, что имена объектов могут вычисляться не только с использованием SHA-1.

    https://www.opennet.dev/opennews/art.shtml?num=50202

     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру