Что делать с большой историей SVN при переходе на GIT?

23

Изменить: в отличие от некоторых похожих вопросов, таких как перемещение репозитория SVN с несколькими ГБ в Git или /programming/540535/managing-large-binary-files-with-git Мой сценарий не включает несколько подпроектов, которые может быть легко конвертирован в субмодули git или в несколько очень больших двоичных файлов, которые хорошо подходят для git-annex. Это единственный репозиторий, в котором двоичные файлы представляют собой набор тестов, которые тесно связаны с основным исходным кодом той же ревизии, как если бы они были активами времени компиляции, такими как графика.

Я изучаю переключение старого svn-репозитория среднего / большого размера (50 пользователей, ревизии 60 Кб, история 80 Гб, рабочая копия 2 Гб). Поскольку число пользователей выросло, в магистрали много оттока, и функции часто распределяются по нескольким коммитам, что затрудняет выполнение проверки кода. Кроме того, без ветвления нет возможности «закрыть» плохой код, проверка может быть выполнена только после того, как он будет передан в транк. Я исследую альтернативы. Я надеялся, что мы могли бы перейти к Git, но у меня есть некоторые проблемы.

Проблема с текущим репо в том, что касается git, заключается в размере. В нем много старого мусора, и очистка его с помощью --filter-branch при преобразовании в git может сократить его размер на порядок, примерно до 5-10 ГБ. Это все еще слишком велико. Самая большая причина большого размера хранилища заключается в том, что в тестирование вводится много двоичных документов. Эти файлы варьируются от .5 МБ до 30 МБ, а их сотни. У них также есть довольно много изменений. Я посмотрел на подмодули, git-annex и т. Д., Но наличие тестов в подмодуле кажется неправильным, равно как и наличие приложения для многих файлов, для которых вам нужна полная история.

Таким образом, распределенная природа git - это то, что мешает мне принять его. Я не особо беспокоюсь о распределении, я просто хочу дешевое ветвление и мощные функции слияния. Как я предполагаю, что 99,9% пользователей git делают, мы будем использовать благословенный центральный репозиторий.

Я не уверен, что понимаю, почему у каждого пользователя должна быть полная локальная история при использовании git? Если рабочий процесс не децентрализован, что эти данные делают на дисках пользователей? Я знаю, что в последних версиях git вы можете использовать мелкий клон только с недавней историей. У меня вопрос: реально ли сделать это в качестве стандартного режима работы для всей команды? Можно ли настроить git так, чтобы он всегда был мелким, чтобы вы могли иметь полную историю только централизованно, но пользователи по умолчанию имеют только 1000 оборотов истории? Вариант для этого, конечно, будет просто конвертировать 1000 оборотов в Git, и сохранить SVN репо для археологии. В этом случае, однако, мы столкнемся с той же проблемой снова после следующих нескольких тысяч пересмотров тестовых документов.

  • Что такое хорошая лучшая практика для использования мерзавца с большими РЕПО , содержащих много бинарных файлов , которые вы действительно хотите историю? Большинство лучших практик и учебных пособий, кажется, избегают этого случая. Они решают проблему нескольких огромных двоичных файлов или предлагают полностью исключить двоичные файлы.
  • Можно ли использовать мелкое клонирование в качестве нормального режима работы или это «взлом»?
  • Могут ли субмодули использоваться для кода, в котором имеется тесная зависимость между ревизией основного источника и ревизией подмодуля (например, в двоичных зависимостях времени компиляции или в модульном тесте)?
  • Насколько велик "слишком большой" для git-репозитория (локально)? Должны ли мы избежать переключения, если мы можем уменьшить его до 4 ГБ? 2 Гб?
Андерс Форсгрен
источник
Я много искал информацию об этом и не нашел ничего, что отвечало бы на мой вопрос. В связанном вопросе workaounrds (подмодули, приложение и т. Д.) Будут работать намного лучше, чем в моем сценарии.
Андерс Форсгрен
1
Git LFS
CodesInChaos
Perforce может быть лучшим вариантом, чем git, так как он предназначен для работы с большим количеством больших двоичных файлов, поэтому используется многими разработчиками игр. Plasticscm также стоит посмотреть.
Ян
Просто отступление: по возможности избегайте подмодулей git, так как они чрезмерно усложняют систему сборки (которая в вашем случае уже сложна).
Игорь Ганапольский

Ответы:

10

Вау, это длинный вопрос (и сложная проблема). Я постараюсь попробовать.

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

Это центральное дизайнерское решение с git. По точным причинам вам нужно спросить автора (Линус Торвальдс), но, насколько я знаю, главная причина - скорость: наличие всего локального (на быстром диске или даже в кеше в ОЗУ) значительно ускоряет операции с историей избегая доступа к сети.

Самая большая причина большого размера хранилища заключается в том, что в тестирование вводится много двоичных документов. Эти файлы варьируются от .5 МБ до 30 МБ, а их сотни. У них также есть довольно много изменений.

Об этом я и подумал бы в первую очередь. Наличие такого большого количества постоянно меняющихся двоичных файлов в системе контроля версий кажется мне проблематичным (даже с SVN). Разве вы не можете использовать другой подход? Идеи:

  • В отличие от исходного кода, бинарный файл размером 3 МБ, вероятно, не написан вручную. Если какой-либо инструмент / процесс генерирует его, рассмотрите возможность его интеграции в свою сборку вместо хранения данных.

  • Если это нецелесообразно, бинарные файлы обычно лучше размещать в хранилище артефактов (например, Artifactory for Maven & co.). Может быть, это вариант для вас.

Я посмотрел на подмодули, git-annex и т. Д., Но наличие тестов в подмодуле кажется неправильным, равно как и наличие приложения для многих файлов, для которых вам нужна полная история.

На самом деле, это выглядит так, как будто git-annex отлично подошел бы. git-application в основном позволяет хранить содержимое файла вне репозитория git (вместо этого репозиторий содержит заполнитель). Вы можете хранить содержимое файла различными способами (центральное git-репо, общий диск, облачное хранилище ...), и вы можете контролировать, какое содержимое вы хотите иметь локально.

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

Напоследок о ваших вопросах:

Какова хорошая практика для использования git с большими репозиториями, содержащими много бинарных файлов, для которых вы хотите историю?

По моему опыту, варианты обычно таковы:

  • избежать необходимости в бинарных файлах репо (генерировать их по требованию, хранить в другом месте)
  • используйте git-annex (или аналогичное решение, такое как Git LFS)
  • жить с большим репо (не все операции git затрагиваются большими файлами, и если у вас быстрый компьютер и диск, это может быть вполне работоспособным)

Можно ли использовать мелкое клонирование в качестве нормального режима работы или это «взлом»?

Это может быть выполнимо; однако, я не думаю, что это решит вашу проблему:

  • вы потеряете все преимущества git, связанные с полной историей, такие как быстрый поиск по истории
  • слияния могут стать хитрыми, потому что у AKAIK у вас должна быть хотя бы история назад к точке ветвления для слияния
  • пользователи должны будут периодически клонировать, чтобы размер их клона был небольшим
  • это просто необычный способ использования git, так что вы, скорее всего, столкнетесь с проблемами со многими инструментами

Насколько велик "слишком большой" для git-репозитория (локально)? Должны ли мы избежать переключения, если мы можем уменьшить его до 4 ГБ? 2 Гб?

Это зависит от структуры репо (несколько / много файлов и т. Д.), От того, что вы хотите сделать, от того, насколько мощны ваши компьютеры, и от вашего терпения :-).

Чтобы дать вам быстрое представление: на моем (новом, но не требующем больших затрат) ноутбуке загрузка файла размером 500 МБ занимает 30-60 с. Простые списки истории (журнал git и т. Д.) Не подвержены влиянию больших файлов; такие вещи, как «git log -S», которые должны сканировать содержимое файла, очень медленные - однако, скорость в основном определяется вводом / выводом, так что это не совсем ошибка git.

Для репозитория объемом 3 ГБ с несколькими ревизиями «git log -S» занимает около минуты.

Так что я бы сказал, что пара ГБ - это нормально, хотя и не идеально. Более 10-20 ГБ, вероятно, подталкивают, но это может быть выполнимо - вам придется попробовать это.

sleske
источник
Спасибо за ваш подробный ответ. Я обязательно изучу использование приложения для тестовых документов. Планка «разумной производительности», вероятно, «близка к svn», т. Е. Если она значительно медленнее для какой-либо операции, тогда будет слишком много трения для переключения.
Андерс Форсгрен
Я думаю, что Git LFS также можно использовать для хранения больших двоичных файлов.
Игорь Ганапольский
@IgorG .: Да, Git LFS - альтернатива, есть и другие. Спасибо за указание, я отредактировал свой пост.
слеске
4

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

Переход на git не решит эти проблемы, они связаны с тем, как вы используете инструмент, и если вы используете git таким же образом, проблемы останутся.

Вы можете легко переходить в svn в git, и объединение обычно такое же простое и имеет те же недостатки. Git был разработан для работы с исходным кодом ядра, поэтому он сделал некоторые допущения, которые могут не применяться во всех случаях, например, у вас с большими двоичными файлами и большой историей. Целью DVCS является то, что каждый пользователь эффективно работает в одиночку и сотрудничает только после этого - то есть у него есть собственное репо (копия), он работает так, как ему нравится, и затем передает изменения любому, кто этого хочет. Федеративная система, используемая в разработке ядра Linux, идеально подходит для этого - вы передаете свои изменения следующему парню по цепочке, который объединяет его со своей кодовой базой, а затем проталкивает его следующему парню, пока не доберется до Линуса, который внесет его в релиз. Большинство команд используют git аналогичным образом, но только с одним вышестоящим парнем, который часто является «золотым» репо на стороне сервера,

Поэтому я бы сначала посмотрел на изменение вашего рабочего процесса, переходя на git, только когда у вас есть лучший способ работы. Реализуйте ветвление и объединение в SVN, если вы не переименовываете файлы или каталоги, объединение проходит достаточно хорошо.

gbjbaanb
источник
4
«Вы можете расшириться в SVN так же легко в мерзавца, и слияние , как правило , так же легко , и имеет те же подводные камни», ничего себе , что это действительно спорное утверждение. Слияние с git, на мой взгляд, обычно очень просто, а в svn - это просто кошмар, даже в тех версиях, где была введена недоделанная попытка отслеживания слияний (да, я работаю с git, а не только с этим репо). Нам нужен рабочий процесс, в котором вы создаете ветвь функций, обзор кода / CI строятся на этой ветке. Нет никакого способа сделать это в SVN без огромного разочарования.
Андерс Форсгрен
2
Нет, мы делаем это все время здесь. Я просто просматриваю 157 веток в моем репозитории SVN, чтобы посмотреть, какие из них можно удалить. Мы разветвляем, разрабатываем, проверяем, а затем объединяемся здесь почти ежедневно, иногда попадаем в неприятности, но это всегда исправляется путем удаления новой ветки из соединительной линии и объединения изменений в нее (так что ее можно легко объединить позже со стволом) , Это действительно относится только к древним ветвям. Если у вас огромное разочарование, вы не понимаете это достаточно хорошо. Git также доставит вам массу разочарований.
gbjbaanb
2
Я просто не испытываю этого. Работая с git (как я уже сказал, но в небольших репозиториях), я нахожу довольно простым и естественным делать разветвление, перебазирование, сжатие и слияние функций. «Конфликты деревьев после переименований» и т. Д. Ощущаются гораздо реже, и тот факт, что вы можете эмулировать линейную и простую историю (с помощью rebase + squash и т. Д.), Очень важен. Итак: ради сохранения вопроса по теме (git с большими репозиториями): предположим, что svn не поддерживает нужный мне рабочий процесс, а git делает.
Андерс Форсгрен
1
В предыдущей компании мы использовали git, и я знаю кого-то, кто регулярно терял свою работу, используя его, так что это ни в коем случае не идеальная система! Также как и SVN, но SVN гораздо лучше подходит для ваших обстоятельств, чем git IMHO, и это работает. По теме, как заставить git работать так, как вы хотите ... Я действительно не уверен, что так и будет, извините.
gbjbaanb
7
@gbjbaanb, если кто-то теряет свою работу с Git, он делает что-то ужасно неправильное.
RubberDuck
2

Загляните в список рассылки GCC. Миграция исходного кода компилятора GCC из SVN в GIT обсуждается прямо сейчас (август и сентябрь 2015 г.), сохраняя при этом историю GCC. См., Например, хранилище для механизма преобразования и критериев принятия для почтовых потоков git-преобразования ; вы найдете ссылки на инструменты и процедуры, связанные с преобразованием (что не так просто, как кажется; преобразование такой большой базы кода требует 36 часов и около 64 ГБ ОЗУ, IIRC)

Василий Старынкевич
источник
Вы имели в виду переход с SVN на Git? Переход от системы контроля версий к набору компиляторов кажется немного ... странным. Кроме того, это выглядит скорее как комментарий, чем как ответ.
8bittree
Да. Извините за опечатку.
Василий Старынкевич,
Спасибо. 36 часов звучит как бриз, наши могут перейти за пару недель ...
Андерс Форсгрен
2

Если преобразование всего хранилища SVN в Git приводит к огромному хранилищу, которое невозможно клонировать, вы можете попробовать использовать SubGit для создания зеркал меньшего размера Git для определенных частей вашего хранилища Subversion.

Например, вы можете импортировать и синхронизировать некоторые подкаталоги вашего SVN-репозитория http://domain/repos/trunk/project/src:

subgit configure --layout auto --trunk trunk/project/src http://domain/repos project.git
edit project.git/subgit/config
edit project.git/subgit/authors.txt
subgit install project.git

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

Как только у вас есть Git mirror этого каталога, вы можете использовать Git-репозиторий для отправки новых изменений, которые немедленно отражаются в SVN-репозитории. Поскольку вы синхронизируете только определенную часть SVN-репозитория, которая значительно сокращает размер преобразованного Git-репозитория, и вы все равно можете создавать ветви, объединять их, использовать любой рабочий процесс со стороны Git.

Кроме того, вы можете импортировать весь репозиторий SVN, но исключить большие файлы из синхронизации:

subgit configure --layout auto --trunk trunk http://domain/repos project.git
edit project.git/subgit/config
...
[svn]
    excludePath = *.bin
    excludePath = *.iso
...
edit project.git/subgit/authors.txt
subgit install project.git

Результирующий репозиторий Git должен иметь разумный размер, и разработчики могут по-прежнему использовать Git для отправки своих изменений в репозиторий Subversion.

Обратите внимание, что это решение должно работать хорошо для вас, если вы готовы поддерживать работу сервера Subversion и использовать Git вместе с вашим SVN-репозиторием.

Отказ от ответственности: я один из разработчиков SubGit; SubGit - коммерческое программное обеспечение с несколькими бесплатными опциями.

vadishev
источник
1

Я подхожу к вашей ситуации следующим образом:

1) Инициализируйте репозиторий git в том же каталоге, что и репозиторий SVN. Сделайте git initи git remote add originдля запуска этого git-репо. Таким образом, вы можете продолжать фиксировать в SVN и git отдельно, не занимаясь полным преобразованием из одного в другое, пока не будете готовы.

2) Активно используйте инструменты bfg и filter-branch , чтобы попытаться сжать свое git-репо, как описано здесь: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3) Используйте git-annex, или Git LFS, или просто внешний сервер хранения для ваших больших двоичных файлов (транспортировка файлов с использованием сценариев оболочки во время сборки).

4) Как только вы освоитесь со стратегией слияния / ветвления в вашем git-репо, и будете довольны размером вашего git-репо, вы можете выполнить полную миграцию из svn в git.

Надеюсь это поможет.

IgorGanapolsky
источник