Изменить: в отличие от некоторых похожих вопросов, таких как перемещение репозитория 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 Гб?
Ответы:
Вау, это длинный вопрос (и сложная проблема). Я постараюсь попробовать.
Это центральное дизайнерское решение с git. По точным причинам вам нужно спросить автора (Линус Торвальдс), но, насколько я знаю, главная причина - скорость: наличие всего локального (на быстром диске или даже в кеше в ОЗУ) значительно ускоряет операции с историей избегая доступа к сети.
Об этом я и подумал бы в первую очередь. Наличие такого большого количества постоянно меняющихся двоичных файлов в системе контроля версий кажется мне проблематичным (даже с SVN). Разве вы не можете использовать другой подход? Идеи:
В отличие от исходного кода, бинарный файл размером 3 МБ, вероятно, не написан вручную. Если какой-либо инструмент / процесс генерирует его, рассмотрите возможность его интеграции в свою сборку вместо хранения данных.
Если это нецелесообразно, бинарные файлы обычно лучше размещать в хранилище артефактов (например, Artifactory for Maven & co.). Может быть, это вариант для вас.
На самом деле, это выглядит так, как будто git-annex отлично подошел бы. git-application в основном позволяет хранить содержимое файла вне репозитория git (вместо этого репозиторий содержит заполнитель). Вы можете хранить содержимое файла различными способами (центральное git-репо, общий диск, облачное хранилище ...), и вы можете контролировать, какое содержимое вы хотите иметь локально.
Возможно, вы неправильно поняли, как работает git-annex? git-annex хранит полную историю всех файлов, которыми он управляет, - он просто позволяет вам выбрать, какое содержимое файла вы хотите иметь локально.
Напоследок о ваших вопросах:
По моему опыту, варианты обычно таковы:
Это может быть выполнимо; однако, я не думаю, что это решит вашу проблему:
Это зависит от структуры репо (несколько / много файлов и т. Д.), От того, что вы хотите сделать, от того, насколько мощны ваши компьютеры, и от вашего терпения :-).
Чтобы дать вам быстрое представление: на моем (новом, но не требующем больших затрат) ноутбуке загрузка файла размером 500 МБ занимает 30-60 с. Простые списки истории (журнал git и т. Д.) Не подвержены влиянию больших файлов; такие вещи, как «git log -S», которые должны сканировать содержимое файла, очень медленные - однако, скорость в основном определяется вводом / выводом, так что это не совсем ошибка git.
Для репозитория объемом 3 ГБ с несколькими ревизиями «git log -S» занимает около минуты.
Так что я бы сказал, что пара ГБ - это нормально, хотя и не идеально. Более 10-20 ГБ, вероятно, подталкивают, но это может быть выполнимо - вам придется попробовать это.
источник
Переход на git не решит эти проблемы, они связаны с тем, как вы используете инструмент, и если вы используете git таким же образом, проблемы останутся.
Вы можете легко переходить в svn в git, и объединение обычно такое же простое и имеет те же недостатки. Git был разработан для работы с исходным кодом ядра, поэтому он сделал некоторые допущения, которые могут не применяться во всех случаях, например, у вас с большими двоичными файлами и большой историей. Целью DVCS является то, что каждый пользователь эффективно работает в одиночку и сотрудничает только после этого - то есть у него есть собственное репо (копия), он работает так, как ему нравится, и затем передает изменения любому, кто этого хочет. Федеративная система, используемая в разработке ядра Linux, идеально подходит для этого - вы передаете свои изменения следующему парню по цепочке, который объединяет его со своей кодовой базой, а затем проталкивает его следующему парню, пока не доберется до Линуса, который внесет его в релиз. Большинство команд используют git аналогичным образом, но только с одним вышестоящим парнем, который часто является «золотым» репо на стороне сервера,
Поэтому я бы сначала посмотрел на изменение вашего рабочего процесса, переходя на git, только когда у вас есть лучший способ работы. Реализуйте ветвление и объединение в SVN, если вы не переименовываете файлы или каталоги, объединение проходит достаточно хорошо.
источник
Загляните в список рассылки GCC. Миграция исходного кода компилятора GCC из SVN в GIT обсуждается прямо сейчас (август и сентябрь 2015 г.), сохраняя при этом историю GCC. См., Например, хранилище для механизма преобразования и критериев принятия для почтовых потоков git-преобразования ; вы найдете ссылки на инструменты и процедуры, связанные с преобразованием (что не так просто, как кажется; преобразование такой большой базы кода требует 36 часов и около 64 ГБ ОЗУ, IIRC)
источник
Если преобразование всего хранилища SVN в Git приводит к огромному хранилищу, которое невозможно клонировать, вы можете попробовать использовать SubGit для создания зеркал меньшего размера Git для определенных частей вашего хранилища Subversion.
Например, вы можете импортировать и синхронизировать некоторые подкаталоги вашего SVN-репозитория
http://domain/repos/trunk/project/src
:Для получения более подробной информации об использовании SubGit обратитесь к его документации .
Как только у вас есть Git mirror этого каталога, вы можете использовать Git-репозиторий для отправки новых изменений, которые немедленно отражаются в SVN-репозитории. Поскольку вы синхронизируете только определенную часть SVN-репозитория, которая значительно сокращает размер преобразованного Git-репозитория, и вы все равно можете создавать ветви, объединять их, использовать любой рабочий процесс со стороны Git.
Кроме того, вы можете импортировать весь репозиторий SVN, но исключить большие файлы из синхронизации:
Результирующий репозиторий Git должен иметь разумный размер, и разработчики могут по-прежнему использовать Git для отправки своих изменений в репозиторий Subversion.
Обратите внимание, что это решение должно работать хорошо для вас, если вы готовы поддерживать работу сервера Subversion и использовать Git вместе с вашим SVN-репозиторием.
Отказ от ответственности: я один из разработчиков SubGit; SubGit - коммерческое программное обеспечение с несколькими бесплатными опциями.
источник
Я подхожу к вашей ситуации следующим образом:
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.
Надеюсь это поможет.
источник