Сравнение между централизованными и распределенными системами управления версиями

Каковы преимущества и недостатки с использованием Централизованных или распределенных систем управления версиями (DVCS)? У вас возникли проблемы с DVCS и как вы защищали эти проблемы? Держите инструмент обсуждения агностиком и пылающим до минимума.

Для тех, кто интересуется, какие инструменты DVCS доступны, вот список наиболее известных DVCS с открытым/открытым исходным кодом:

Ответ 1

От моего ответа к другому question:

Системы управления распределенной версией (DVCS) решают разные проблемы, чем Централизованные VCS. Сравнение их как сравнение молотков и отверток.

Централизованные системы VCSразработанный с намерением Один истинный источник, который благословен, и поэтому хорошо. Все разработчики работают (checkout) из этого источника, а затем добавить (зафиксировать) свои изменения, которые затем так же Блажен. Единственный реальная разница между CVS, Subversion, ClearCase, Perforce, VisualSourceSafe и все остальные CVCSes находится в рабочем процессе, производительности и интеграции, которые каждый продуктов.

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

Реальный выбор между использованием одного типа или другой организационно - если ваш проект или организация хочет централизованное управление, то DVCS является без стартера. Если ваши разработчики ожидается, что страна/мир, без безопасности широкополосные подключения к центральному репозиторий, то DVCS - это, вероятно, ваш спасение. Если вам нужны оба, вы fsck'd.

Ответ 2

Тем, кто считает, что распределенные системы не позволяют копии, пожалуйста, обратите внимание, что существует множество мест, где системы имеют авторитетные копии, идеальным примером является, вероятно, Линейное дерево Linus. У многих людей есть свои деревья, но почти все они текут к дереву Линуса.

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

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

С распределенным репо вы идете по делу как обычно, совершаете, двигаетесь дальше, когда вы снова получаете доступ к сети, вы нажимаете на свое "одно истинное репо" и ничего не изменилось.

Не говоря уже о другой приятной вещи о распределенных репозиториях: full история всегда доступна. Вам нужно посмотреть журналы ревизий, когда от сети? Вам нужно пояснить источник, чтобы узнать, как ошибка был представлен? Все возможно с распределенными репозиториями.

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

Ответ 3

Не совсем сравнение, но вот что делают большие проекты:

Централизованные VCSes

  • Subversion

    Apache, GCC, Ruby, MPlayer, Zope, Plone, Xiph, FreeBSD, WebKit,...

  • CVS

    CVS

Распределенные VCSes

  • git

    Ядро Linux, KDE, Perl, Ruby on Rails, Android, Wine, Fedora, X.org, Mediawiki, Django, VLC, Mono, Gnome, Samba, CUPS, GnuPG, Emacs ELPA...

    /li >
  • mercurial (hg)

    Mozilla и Mozdev, OpenJDK (Java), OpenSolaris, ALSA, NTFS-3G, Dovecot, MoinMoin, mutt, PETSc, Octave, FEniCS, Aptitude, Python, XEmacs, Xen, Vim, Xine...

  • bzr

    Emacs, Apt, Mailman, MySQL, Squid,... также продвигаются в Ubuntu.

  • darcs

    ghc, ion, xmonad,... популярный в сообществе Haskell.

  • fossil

    SQLite

Ответ 4

W. Craig Trader сказал это о DVCS и CVCS:

Если вам нужны оба, вы fsck'd.

Я бы не сказал, что вы используете fsck'd при использовании обоих. Практически разработчики, которые используют инструменты DVCS, обычно пытаются объединить свои изменения (или отправлять запросы на тягу) в центральное место (как правило, к ветке выпуска в репозитории выпуска). Существует некоторая ирония с разработчиками, которые используют DVCS, но, в конце концов, с централизованным рабочим процессом, вы можете начать задаваться вопросом, действительно ли распределенный подход лучше централизованного.

Есть некоторые преимущества с DVCS по CVCS:

  • Понятие однозначно распознаваемых коммитов делает отправку патчей между сверстниками безболезненными. То есть вы делаете патч как фиксацию и делитесь им с другими разработчиками, которые в этом нуждаются. Позже, когда каждый хочет объединиться, эта конкретная фиксация признается и может быть сопоставлена ​​между ветвями, имея меньше шансов на слияние конфликта. Разработчики склонны отправлять патчи друг другу с помощью USB-накопителя или электронной почты независимо от используемого вами инструмента управления версиями. К сожалению, в случае CVCS управление версиями регистрирует коммиты как отдельные, не признавая, что изменения совпадают, что приводит к более высокой вероятности конфликта слияния.

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

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

... и некоторые недостатки, которые обычно имеют обходные пути:

  • Кто имеет последнюю версию? В CVCS соединительная линия обычно имеет последнюю ревизию, но в DVCS это может быть явно не очевидным. Обходной путь заключается в использовании правил поведения, которые разработчики в проекте должны прийти к соглашению, в котором репо объединит свою работу.

  • Пессимистические блокировки, то есть файл заблокирован при выполнении выписки, обычно невозможен из-за concurrency, который может произойти между репозиториями в DVCS. Блокировка файла причины существует в управлении версиями, потому что разработчики хотят избежать конфликтов слияния. Тем не менее, блокировка имеет недостаток в замедлении разработки, поскольку два разработчика не могут работать на одном и том же фрагменте кода одновременно с длинной моделью транзакций, и это не полная гарантия на конфликты слияния. Единственными разумными способами, независимо от управления версиями, является борьба с большими конфликтами слияния, это хорошая архитектура кода (например, высокая сцепляемость с низким сцеплением) и разделение ваших рабочих задач, чтобы они не влияли на код (что проще сказать, чем сделать).

  • В проприетарных проектах было бы катастрофой, если бы весь репозиторий стал общедоступным. Тем более, если недовольный или злонамеренный программист получает клонированный репозиторий. Утечка исходного кода является серьезной болью для проприетарных компаний. DVCS делает это простым, поскольку вам нужно всего лишь клонировать репозиторий, в то время как некоторые системы CM (такие как ClearCase) пытаются ограничить этот доступ. Однако, на мой взгляд, если у вас есть достаточное количество дисфункциональности в вашей корпоративной культуре, тогда контроль версий в мире не поможет вам избежать утечки исходного кода.

Ответ 5

Во время поиска подходящего SCM я нашел следующие ссылки, чтобы помочь:

Ответ 6

В какой-то степени эти две схемы эквивалентны:

  • Распределенная VCS может тривиально эмулировать централизованную, если вы просто всегда нажимаете свои изменения в какой-то определенный репозиторий upstream после каждого локального коммита.
  • Централизованный VCS обычно не может эмулировать распределенный как вполне естественно, но вы можете получить что-то очень похожее, если вы используете что-то вроде quilt поверх нее. Одеяло, если вы не знакомы с ним, является инструментом для управления большими наборами патчей поверх некоторого проекта вверх. Идея здесь заключается в том, что команда фиксации DVCS реализована путем создания нового патча, а команда push реализуется путем передачи каждого выдающегося патча в централизованный VCS, а затем отбрасывания файлов патчей. Это звучит немного неудобно, но на практике это работает довольно хорошо.

Сказав это, есть несколько вещей, которые традиционно делают DVCSes, и большинство централизованных VCS-ов делают немного хэша. Наиболее важным из них, вероятно, является ветвление: DVCS будет очень легко разветвлять репозиторий или объединять ветки, которые больше не нужны, и будет отслеживать историю, пока вы это делаете. Нет никакой особой причины, по которой централизованная схема будет иметь проблемы с этим, но исторически никто, похоже, еще не исправился. Будет ли это на самом деле проблемой для вас, зависит от того, как вы собираетесь организовывать разработку, но для многих это важно.

Другим позитивным преимуществом DVCS является то, что они работают в автономном режиме. У меня никогда не было много пользы для этого; В основном я занимаюсь разработкой либо в офисе (например, в репозитории в локальной сети), либо дома (там есть ADSL). Если вы занимаетесь разработкой ноутбуков во время поездок, это может быть для вас более важным.

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

Ответ 7

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

Затем начался гудок GIT, и мне просто пришлось его протестировать. И для меня главной торговой точкой было разветвление. О, парень. Теперь мне больше не нужно очищать свой репозиторий, возвращать несколько версий или любые глупые вещи, которые я делал при использовании подрывной деятельности. Все дешево в dvcs. Я только пробовал окаменелость и GIT, хотя, но я использовал perforce, cvs и subversion, и похоже, что у dvcs есть действительно дешевое разветвление и тегирование. Больше не нужно копировать весь код в одну сторону, и поэтому слияние - просто легкий ветерок.

Любые dvcs могут быть настроены с центральным сервером, но то, что вы получаете, среди прочего

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

И вы можете работать без сети.

Короче говоря, использование контроля версий всегда хорошо. Использование dvcs дешевле (в КБ и полосе пропускания), и я думаю, что это более интересно использовать.

Для проверки GIT: http://git-scm.com/
Для проверки Fossil: http://www.fossil-scm.org
Для проверки Mercurial: https://www.mercurial-scm.org

Теперь я могу только рекомендовать системы dvcs, и вы легко можете использовать центральный сервер

Ответ 8

Распределенные VCS привлекательны во многих отношениях, но одним из недостатков, которые будут важны для моей компании, является проблема управления не слиявшимися файлами (обычно двоичными, например, документами Excel). Subversion имеет дело с этим, поддерживая свойство "svn: needs-lock", что означает, что вы должны получить блокировку для не слияния файла, прежде чем редактировать его. Это работает хорошо. Но для этого потока требуется централизованная модель репозитория, что противоречит концепции DVCS.

Итак, если вы хотите использовать DVCS, это не подходит для управления файлами, которые не слияния.

Ответ 9

Основная проблема (помимо очевидной проблемы с пропускной способностью) - право собственности.

То есть, чтобы другой (географический) сайт не работал над одним и тем же элементом, чем другой.

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

Чтобы ответить на комментарии к этому ответу, вы действительно хотите, чтобы инструмент рассказывал вам, кому принадлежит, а затем обмениваться сообщениями (через телефон, IM или почту) с удаленным сайтом.
Если у вас нет механизма собственности... вы будете "общаться", но часто слишком поздно;) (т.е. После выполнения параллельной разработки на идентичном наборе файлов в той же ветки. Конец может стать беспорядочным)

Ответ 10

Для меня это еще одна дискуссия о личном вкусе, и довольно сложно быть действительно объективным. Я лично предпочитаю Mercurial по сравнению с другими DVCS. Мне нравится писать перехватчики на том же языке, что и Mercurial написано и меньше накладных расходов сети - просто чтобы сказать некоторые из моих собственных причин.

Ответ 11

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

Ответ 12

У меня такое ощущение, что Mercurial (и другие DVCS) более сложные, чем централизованные. Например, объединение ветки в Mercurial сохраняет всю историю ветки, тогда как в SVN вы должны перейти в каталог ветвей, чтобы просмотреть историю.

Ответ 13

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

Допустим, у вас есть набор общих скриптов. Если на каждом компьютере, на котором вы работаете, есть клон, вы можете по требованию обновить и изменить свои скрипты. Он дает вам:

  • задержка времени, особенно с помощью клавиш ssh
  • способ разделить различия между различными системами (например, Red Hat vs Debian, BSD vs Linux и т.д.)

Ответ 14

W. Крейг Трейдер отвечает на большинство из них, однако, я считаю, что личный стиль работы также имеет огромное значение. Там, где я сейчас работаю, мы используем подрывную деятельность как наш One True Source, однако многие разработчики используют git -svn на своих персональных компьютерах, чтобы компенсировать проблему рабочего процесса, которую мы имеем (сбой управления, но эта другая история). В любом случае. его действительно о балансировании того, какие наборы функций делают вас наиболее продуктивными с тем, что требуется организации (например, централизованная аутентификация).

Ответ 15

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

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