Распределенное управление версиями для ОГРОМНЫХ проектов - возможно ли это? - PullRequest
11 голосов
/ 19 марта 2010

Мы сейчас очень довольны SVN, но Учебник Джоэла заинтриговал меня. Так что мне было интересно - будет ли это возможно и в нашей ситуации?

Дело в том, что наше хранилище SVN ОГРОМНО. Само программное обеспечение имеет 15-летнее наследие и уже пережило несколько различных систем контроля версий. Существует более 68 000 ревизий (наборов изменений), сам источник занимает более 100 МБ, и я даже не могу догадаться, сколько ГБ потребляет весь репозиторий.

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

Как Mercurial (или любой другой распределенный контроль версий) справляется с этим? Или они непригодны для таких огромных проектов?

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

Добавлено 2: Вторая мысль - репозиторий ядра Linux использует git и, вероятно, на порядок или два больше моего. Так как они заставляют это работать?

Ответы [ 10 ]

13 голосов
/ 19 марта 2010

Распределенное управление версиями для ОГРОМНЫХ проектов - возможно ли это?

Абсолютно! Как вы знаете, Linux массивный и использует Git. Mercurial используется также для некоторых крупных проектов , таких как Python, Mozilla, OpenSolaris и Java.

Мы сейчас очень довольны SVN, но урок Джоэла заинтриговал меня. Так что мне было интересно - будет ли это возможно и в нашей ситуации?

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

Дело в том, что наше хранилище SVN ОГРОМНО. [...] Существует более 68 000 ревизий (наборов изменений), сам источник занимает более 100 МБ

Как отмечали другие, на самом деле это не так уж много по сравнению со многими существующими проектами.

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

И Git, и Mercurial очень эффективны в управлении хранилищем, и их репозитории занимают гораздо меньше места, чем эквивалентные репозитории Subversion (в которых конвертировано несколько). И как только у вас есть начальная проверка, вы только толкаете дельты вокруг, что очень быстро . Они оба значительно быстрее в большинстве операций. Первоначальный клон - единовременная стоимость, поэтому не имеет значения, сколько времени это займет (и, держу пари, вы будете удивлены!).

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

Дисковое пространство дешево. Производительность разработчиков важнее. Так что, если репо занимает 1 ГБ? Если вы можете работать умнее, оно того стоит.

Как Mercurial (или любой другой распределенный контроль версий) справляется с этим? Или они непригодны для таких огромных проектов?

Вероятно, стоит прочитать о том, как проекты, использующие Mercurial , такие как Mozilla, управляли процессом преобразования. Большинство из них имеют несколько репозиториев, каждый из которых содержит основные компоненты. Mercurial и Git также поддерживают вложенные репозитории. И есть инструменты для управления процессом конвертации - Mercurial имеет встроенную поддержку для импорта из большинства других систем .

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

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

Добавлено 2: Вторая мысль - репозиторий ядра Linux использует git и, вероятно, на порядок или два больше моего. Так как они заставляют это работать?

Git предназначен для сырой скорости. Формат на диске, проводной протокол, алгоритмы в памяти сильно оптимизированы. И они разработали сложные рабочие процессы, в которых патчи передаются от отдельных разработчиков, вплоть до сопровождающих подсистем, вплоть до лейтенантов и, в конечном итоге, до Линуса. Одна из лучших особенностей DVCS заключается в том, что они настолько гибки, что допускают все виды рабочих процессов.

Предлагаю вам прочитать превосходную книгу по Mercurial Брайана О'Салливана, которая поможет вам быстро набрать скорость. Скачайте Mercurial и поработайте с примерами, поиграйте с ним в некоторых репозиториях, чтобы почувствовать его.

Затем запустите команду convert, чтобы импортировать существующий исходный репозиторий. Затем попробуйте внести некоторые локальные изменения, коммиты, ветки, просмотреть журналы, использовать встроенный веб-сервер и так далее. Затем клонируйте его в другую коробку и внесите изменения. Определите время наиболее распространенных операций и посмотрите, как они сравниваются. Вы можете сделать полную оценку бесплатно, но только в свое время.

11 голосов
/ 19 марта 2010

100 МБ исходного кода меньше, чем ядро ​​Linux. Журнал изменений между ядром Linux 2.6.33 и 2.6.34-rc1 имеет 6604 коммитов. Ваша шкала хранилища не кажется мне пугающей.

  • Ядро Linux 2.6.34-rc1, распакованное из архива .tar.bz2: 445 МБ
  • Головка ядра Linux 2.6 извлечена из основного дерева Линуса: 827 МБ

В два раза больше, но все еще арахис на больших жестких дисках у всех нас.

3 голосов
/ 01 апреля 2010

Не беспокойтесь о требованиях к пространству хранилища.Мой анекдот: когда я преобразовал нашу кодовую базу из SVN в git (полная история - я думаю), я обнаружил, что клон использовал меньше места, чем просто рабочий каталог WVN.SVN сохраняет нетронутую копию всех ваших извлеченных файлов: посмотрите на $ PWD / .svn / text-base / в любой проверке SVN.С git вся история занимает меньше места.

Что меня по-настоящему удивило, так это то, насколько эффективен git для сети.Я сделал git-клон проекта в хорошо связанном месте, а затем забрал его домой на флэш-диск, где я постоянно обновляю его до git fetch / git pull, используя только мое маленькое маленькое соединение GPRS.Я бы не посмел сделать то же самое в проекте, контролируемом SVN.

Вы действительно обязаны сделать это, по крайней мере, сами.Я думаю, вы будете удивлены тем, насколько неправильными были ваши предположения, связанные с централизованным VCS.

2 голосов
/ 19 марта 2010

Вы говорите, что довольны SVN ... так зачем меняться?

Что касается распределенных систем контроля версий, Linux использует git, а Sun - Mercurial.Оба являются впечатляюще большими хранилищами исходного кода, и они прекрасно работают.Да, вы получаете все изменения на всех рабочих станциях, но это цена, которую вы платите за децентрализацию.Помните, что хранилище стоит дешево - на моем ноутбуке для разработки в настоящее время имеется 1 ТБ (2x500 ГБ) места на жестком диске.Протестировали ли вы подтягивание своего репозитория SVN в нечто вроде Git или Mercurial, чтобы на самом деле увидеть сколько места это займет?

Мой вопрос был бы: готовы ли вы как организация перейти на децентрализацию?Для магазина программного обеспечения обычно имеет гораздо больше смысла хранить центральный репозиторий (регулярные резервные копии, подключения к CruiseControl или FishEye, их легче контролировать и администрировать).

И если вы просто хотите что-то более быстрое или более масштабируемое, чем SVN, просто купите коммерческий продукт - я использовал и Perforce, и Rational ClearCase, и они без проблем масштабируются до огромных проектов.

2 голосов
/ 19 марта 2010

Вам нужна вся история? Если вам нужен только последний год или два, вы можете оставить текущий репозиторий в состоянии «только чтение» для исторической справки. Затем создайте новый репозиторий с только недавней историей, выполнив svnadmin dump с ревизией нижней границы, которая является основой для вашего нового распределенного репозитория.

Я согласен с другим ответом, что 100 МБ рабочей копии и 68 КБ версий не так уж велики. Дайте ему шанс.

1 голос
/ 19 марта 2010

Я использую git в довольно большом проекте на c # /. Net (68 проектов в 1 решении), и объем TFS для свежей выборки полного дерева составляет ~ 500 МБ. Репозиторий git, хранящий достаточное количество коммитов локально, весит ~ 800Mb. Сжатие и внутренняя работа хранилища в git превосходны. Удивительно видеть так много изменений, упакованных в такое небольшое пространство.

1 голос
/ 19 марта 2010

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

0 голосов
/ 20 марта 2010

Git, очевидно, может работать с таким большим проектом, как ваш, поскольку, как вы указали, одно только ядро ​​Linux больше.

Проблема (не знаю, управляете ли вы большими файлами) с Mercurial и Git в том, что они не могут управлять большими файлами (пока).

У меня есть опыт переноса проекта вашего размера (и примерно на 15 лет) из CVS / SVN (на самом деле их сочетания) в Plastic SCM для распределенного и централизованного (эти два рабочих процесса происходят внутри одной организации в в то же время) развитие.

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

0 голосов
/ 19 марта 2010

По моему опыту, Mercurial довольно хорошо справляется с большим количеством файлов и огромной историей.Недостатком является то, что вы не должны регистрировать файлы размером более 10 Мб.Мы использовали Mercurial для хранения истории нашей скомпилированной DLL.Не рекомендуется помещать двоичные файлы в исходный счетчик, но мы все равно попробовали (это был репозиторий, предназначенный для двоичных файлов)В хранилище было около 2 гигабайт, и мы не слишком уверены, что сможем продолжать делать это в будущем.Во всяком случае, для исходного кода я не думаю, что вам нужно беспокоиться.

0 голосов
/ 19 марта 2010

нет, не работает. Вам не нужно ничего, что требует значительного хранилища на стороне клиента. Если вы получите такой большой размер (с помощью повторного примера изображений и т. Д.), Хранилище в любом случае требует больше, чем обычная рабочая станция, чтобы быть эффективной.

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

...