Персональные инструменты
 

Distributed Version Control Systems: A Not-So-Quick Guide Through

Материал из CustisWiki

Перейти к: навигация, поиск

Перевод статьи «Distributed Version Control Systems: A Not-So-Quick Guide Through» от Sebastien Auvray с портала InfoQ.

3-atlets-on-start.jpg

Note.svg Sébastien Auvray — senior software designer и энтузиаст технологий. Его заставляли использовать CVS и SVN, теперь он страдает на работе от ежедневного использования Perforce. Sébastien также один из редакторов InfoQ по теме Ruby.


Caution.svg К моменту перевода прошел уже год, и многие положения статьи изменились — самые очевидные исправлены переводчиком (Стас Фомин) (в частности, исправлены битые ссылки), часть снабжены сносками, указывающими на произошедшие изменения.

После выступления Линуса Торвальдса в Google в мае 2007, просвященного GIT, постоянно растет интерес и число пользователей распределенных систем контроля версий (Distributed Version Control Systems, DVCS).

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

Так что же это?

Системы управления версиями (СУВ, SCM, Source Control Management) следят за всеми версиями каждой информационной единицы. Обычно они используются в разработке ПО для ведения исходных кодов проекта. Самой древней из широко известных СУВ была CVS, разработка началась в 1986 году.

С тех пор выросло множество СУВ, различным образом улучшающих CVS:

Braches-in-vcs.png

В декабре 1999, для ведения основного ствола исходников Ядра Линукса Линус выбрал BitKeeper, характеризовав его как «Лучший инструмент для этой работы».

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

Все предшественники BitKeeper работали в централизованной модели «Клиент—(Центральный)Сервер», и BitKeeper был первой VCS разрешивший полную распределенность, когда каждый имеет собственный репозиторий. Но из-за лицензионных конфликтов, BitKeeper был отринут в пользу git (апрель 2005).

Теперь есть и другие системы, использующие ту же модель:

Зачем все это?

Или даже более конкретно: «А чем не устраивают CVCS (Централизованные СУВ)? Subversion-то чем не угодил?»

Вот в чем обвиняют Subversion:

  • Главное: ветвится стало легко, но слияние-то по-прежнему мучительно (а ведь зачем «ветвление без слияний?»). Наверняка во всех проектах вам придется развлекаться с ветками разработки и тестирования. А у Subversion нет «безопасного повторного» слияния, пользователей заставляют вручную отслеживать интервалы ревизий, которые уже были интегрированы в другие ветки, и все это разумеется подвержено ошибкам.
  • Никак не послать изменения другому пользователю минуя центральный сервер.
  • Subversion не может интегрировать измененения при переименовании файлов или каталогов[1].
  • Нужно специально придерживаться «trunk/tags/branches»-соглашения о ветках (См. misleading).
  • Нет оффлайн-коммитов.
  • Подкаталоги .svn замусоривают рабочую копию.
  • Обработка свойства svn:external может быть опасна.
  • Производительность: Performance

Современные DVCS-системы все это исправили, как собственными фишками реализации, так и самой идеологией распределенности.

Но, как мы увидим дальше, Subversion еще не сдается!

Как?

Децентрализация

Распределенные системы управления версиями выигрывают за счет «peer-to-peer»-подхода. Участники могут взаимодействовать друг с другом и поддерживать их локальные ветки без необходимости в центральном сервере и даже репозитории. То есть синхронизация идет между равными участниками, самостоятельно решившими, какими изменениями обменяться.

CVCSvsDVCS.png

Это приводит к сущетвенным отличиями и преимуществам над централизованными системами:

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

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

  • Каждая рабочая копия на самом деле представляет собой полный бэкап всех исходников с историей правок, в общем, естественным образом образовалась надежность от потери данных.
  • Экспериментальные ветки — ветки очень просто и быстро создаются и уничтожаются.
  • Участникам легко взаимодействовать друг с другом.

Для введения в непосредственно практики DVCS-разработки, можете взглянуть на статьи Intro to Distributed Version Control (Illustrated) или возможно Collaboration workflows.

С другой стороны, стоит предупредить вас о некоторых проблемах выбора DVCS, особенно о проблеме сложности использования: этот децентрализованный подход весьма отличается от старого доброго Централизованного Мира, и может потребоваться время, чтобы ваши разработчики смогли им воспользоваться. Отслеживание наборов изменений (changeset) вместо ведения истории файлов тоже может запутать, несмотря на свою мощность, благодаря которой он сможет отслеживать такие вещи, как перемещение функции между файлами.

Кто?

А теперь контрольверсийсрач! «Что такое хорошо, и что такое плохо».

Все эти плюсы и минусы собраны в основном из (вычитанной и проверенной, ибо многие аргументы устаревали) компиляции блогов и личного опыта.

Caution.svg Учтите, что это весьма краткий лист свойств (например, у git более 150 команд), и что важность их разная.

Для простоты, приведем сначала общие свойства всех трех систем:

  • Модель конкурентного взаимодействия: «Слияние»
  • Лицензия: GPL
  • Бесплатны
  • Основные возможности:
    • Атомарные коммиты
    • Слияния переименований файлов
    • Поддержка симлинков
    • Пре- и пост- триггеры (hooks) на события
    • Отслеживание слияний
    • Теги

Теперь приведем сводную таблицу различающихся свойств:

git Mercurial Bzr
Git-logo.png http://git.or.cz/ Mercurial-logo.png http://www.selenic.com/mercurial/ Bzr-logo.png http://bazaar-vcs.org/
ГлавАвтор Junio C Hamano Matt Mackall Canonical Ltd. (идет переход в GNU project)
Платформы POSIX, Windows, Mac OS X Unix-like, Windows, Mac OS X Unix-like, Windows, Mac OS X
Версия Ok16.png > 1.0 (1.6.5.1) Ok16.png > 1.0 (1.3.1) Ok16.png > 1.0 (2.0.0)
Запуск проекта апрель 2005 апрель 2005 март 2005
Реализация
SLOC (без тестов) Git-sloc.png Hg-sloc.png Bzr-sloc.png
SLOC Count 130550 38172 79864
Покрытие тестами (% исходников относящихся к тестам) Ok16.png ~20 % Ok16.png ~25 % Ok16.png ~50 %
Модель истории Snapshot Changeset Snapshot
Рост репозитория O(patch) O(patch) O(patch)
Сетевые протоколы HTTP, FTP, email bundles, custom, ssh, rsync HTTP, ssh, email HTTP, SFTP, FTP, ssh, custom, email bundles
Подпись ревизий Ok16.png Ok16.png Caution.svg Частично/Ручная проверка[2]
Слияние изменений Ok16.png Ok16.png Ok16.png
EOL-соглашения Ok16.png Ok16.png No.svg Запланировано в 1.6Ok16.png[3]
Интернационализация No.svg Ok16.png Ok16.png
Частичный checkout No.svg Используйте вместо этого подмодули No.svg Запланировано No.svg Запланировано
Модель / Архитектура
Файлы Один подкаталог .git вверху Один подкаталог .hg вверху Один подкаталог .bzr вверху
Модель Простая модель ветвлений (ветка=клон) Простая модель ветвлений (ветка=клон)
Особенности репозиториев Разделяемые репозитории для совместного использования ревизий в разных ветках Supposed-to-be Better Storage Model
Версионирование каталогов No.svg No.svg Ok16.png
Подмодули Ok16.png git-submodule Ok16.png Forest extension (as used by OpenJDK Caution.svg Решаемо через сторонние инструменты ConfigManager
Индивидуальные коммиты для отдельного файла No.svg Противоречит архитектуре No.svg Противоречит архитектуре No.svg Противоречит архитектуре
Rebase/Queue Ok16.png rebase Ok16.png Mercurial Queues Ok16.png Rebase plugin, Loom plugin (comp. with Quilt)
Web-доступ
Ok16.png Note.svg Read-only доступ можно дать публикацией статических файлов по HTTP. Ok16.png Note.svg Read-only доступ можно дать публикацией статических файлов по HTTP. Caution.svg Не так хорошо. Теперь доступен более быстрый Smart Server.
gitweb, wit, cgit hgweb (single rep), hgwebdir (multi rep) webserve, trac, Loggerhead
Интеграция
Интеграция (API) No.svg Скорее скриптуем, чем API-интегрируем (хотя есть некий заброшенный API-frontend: Ruby/Git) Ok16.png Ok16.png Богатый API
Миграция Ok16.png Хороша. git-svn тоже весьма мощная штука, представляет двухсторонний прокси между Subversion и Git, позволяет исползовать Git поверх существующего репозитория Subversion. Ok16.png Хороша. Но hgsvn не настолько отлажен, как git-svn. Caution.svg Неплохо реализована, но медленная.
Интеграция с Issue-трекерами Caution.svg Есть для Trac, паллиатив для Bugzilla. Для JIRA увы нет. Ok16.png Есть для Trac, Bugzilla, JIRA. Caution.svg Есть для Trac и Bugzilla, нет для JIRA.
Плагины к IDE Ok16.png Idea, Eclipse, NetBeans Ok16.png Idea, Eclipse, NetBeans, MS Visual Studio(VisualHG, hgcc) Caution.svg Idea, Eclipse. Нет для NetBeans
Плагины Ok16.png Emacs / Vim / … Ok16.png Emacs / Vim / … Ok16.png Emacs / Vim / …
Производительность
Ok16.png git всегда был быстрее No.svg bzr всегда самый медленный из этой троицы.
Навороты
Ok16.png С 150 выполняемыми файлами-командами нетрудно найти любую суперкоманду, о которой вы всегда мечтали (хотя это конечно увеличивает сложность)
Сложность
Bzr декларирует скрытие сложности поддержанием четкого и ясного пользовательского интерфейса, при этом адаптируясь к различным моделям взаимодействия workflows и даже их эволюции в каждой команде.
Именование версий/ревизий No.svg Ревизии — SHA-1 хеши, что не особо юзер-френдли, если например, запрашивать различия между версиями. Так сделано, чтобы гарантировать надежность и целостность данных, а также чтобы избежать конфликтов при слиянии с другими участниками. Ok16.png Простое именование Ok16.png Простое именование: r1, r2, etc
Команды Caution.svg Понятные, за рядом исключений типа команды rename, которая отличается от других SCM (и уже не поменяют из-за поддержки обратной совместимости). git это наиболее навороченная по командам СУВ, но очень сложно овладеть полным набор всех его команд и опций.

Существование инструментов типа Easy Git только подтверждает исключительную сложность Git.

Ok16.png Понятные (похожие на команды Subversion) Ok16.png Понятные
Число пользователей
Ok16.png Большое / Много (и крупных) проектов на git[4] Ok16.png Большое / Много (и крупных) проектов на hg. No.svg Меньше предыдущих: кроме проектов Canonical (Ubuntu, Launchpad), особо крутых проектов нет.
Linux kernel, Cairo, Wine, X.Org, Rails, Rubinius, Compiz Fusion Xine, OpenJDK, OpenSolaris, NetBeans, (Part of) Mozilla Ubuntu (частично), Launchpad
Документация Ok16.png Хороша. Хороший man с кучей примеров. Ok16.png Хороша. Ok16.png Хороша.
Платформы
Caution.svg Плохая Windows-поддержка Ok16.png Кроссплатформенный Ok16.png Кроссплатформенный
Ok16.png Полезные особенности
git скорее скриптуем, чем расширяем, что с одной стороны хорошо, а с другой — плохо. Легко использовать из скрипта, например, все тесты можно сделать из bash. Весьма настраиваем в продвинутом администрировании:
  • Промежуточные области [5],
  • Заброшенные объекты [6],
  • detached heads[7],
  • plumbing vs porcelain[8],
  • reflogs [9].

Возможны локальные (внутрирепозитарные) ветки.

Robust Renaming. Robust Renaming. Поддержка легких checkouts (без истории). Bound branches. Возможны локальные (внутрирепозитарные) ветки. Patch Queue Manager (управление несколькими ветками, выполнение слияний для разработчиков)
Ok16.png Несколько крутых команд/расширений
  • git-stash (поддержка прерывания для краткого баг-фикса в другом проекте),
  • git-cherry-pick (для выбора отдельных коммитов, без полных веток),
  • git-rebase «Quilt-like changeset» типа Mercurial Queues).
  • git add -i аналог Mercurial RecordExtension.

Похоже тут есть все команды, которые вы бы могли захотеть.

  • RecordExtension — позволяет выбрать, какую часть изменений рабочего каталога вы собираетесь закоммитить.
  • Hg Shelve Extension — аналог git-stash: — интерактивно выбрает изменения, чтобы их «обойти».
  • Shelf — аналог git-stash: поддержка прерывания для краткого баг-фикса в другом проекте, но похоже помирает — последнее изменение в марте 2007.
  • bzr-dbus — для броадкаста ревизий и триггеров.
No.svg Проблемы

[10].

  • Настройка статического read-only HTTP-доступа слегка туповата (--bare и update-server-info).
  • Обработка файлов в Unicode (UTF-16).
  • Модель хранения. Git хранит каждый отдельный объект как отдельный файл, без обязательного вычисления дельты между ревизиями (это делает отдельная команда). Обязательно настройте, чтобы регулярно запускалась команда pack.
  • Мешанина из C, Perl и скриптов на bash, что очень затрудняет полноценный перенос на другие системы.
  • Renaming not handled as good as bzr. [FIXED]
  • Нет локальных веток, нужно использовать клон. Чтобы сэкономить место, Hg использует hardlinking, из-за чего возникают проблемы при pull (и еще под Windows).
  • Расширение «Forest» (для подмодулей) неродное, и плохо документировано.
GUI
Windows No.svg Уже не так все плохо[11] Ok16.png TortoiseHg Caution.svg Сложновато. TortoiseBzr (нет коммитов после Aug 2007, хотя проект пока жив)[12]. WildcatBZR[13].
Linux Ok16.png gitk, git-gui, tig, … Ok16.png TortoiseHg, Hgtk, hgct Ok16.png bzr-gtk, …
Инсталляция
Caution.svg Нужен либо cygwin либо специальный git-дистрибутив типа Git on MSys Ok16.png Ok16.png
Бесплатные хостинги
GitHub, gitorious FreeHg[14] Launchpad

Caution.svg Полно еще споров, например, от том, что каталоги в Bzr это ветки, а не контейнеры веток, как в git.

А то, что Mercurial использует внешние инструменты для слияний, критикуют стороники Bazaar. Это исправлено с версии Mercurial v1.0.

Есть и другие нексколько предвзятые сравнения от Bazaar-команды:

и соответственно, ответ на это:

Some User Statistics from Git Survey 2007

Caution.svg Обратите внимание, что в этом отчете не было возможности выбрать Ruby, неплохо было бы добавить его в опрос 2008 года[15].

Note.svg Очень забавно, что треть людей используют DVCS взаимодействуюя с … 0 или 1 участниками![16].

GUI

Графический интерфейс ко всем системам хороший и примерно одинаковый, хотя gitk наверное эффективней.

TortoiseHg (с активированной опцией «folder watch») сильно тормозит на больших репозиториях, типа Мозилловского.

gitk on Linux
TortoiseHg on Windows
OliveGtk on Linux

Краткий взгляд на производительность (не претендует на истину в последней инстанции)

git по прежнему лидирует в битве за производительность, но Hg и Bzr существенно улучшились за последний год.

Обратите внимание, что Mercurial удваивает количество файлов в вашем репозитории (история хранится по-файлово в .hg/store/data). Это не шибко хороший выбор для Windows-систем, живущих на NTFS.

Также интересно видеть, что у git большое преимущество за счет операционной системы при выполнении команд. Hg и Bzr не тратят большую часть времени в системных вызовах, а Git проводит в них до 10-40 % времени. Возникает ожидаемый вопрос, о том, будет ли его производительность также хороша под Windows, где git-разработчики не имеют доступа к ко всем возможностям системы, как у них было под Linux.

Надо тестировать как отдельные слияния, так и слияние очередями, это связанная часть тестов.

Бенчмарки надо также гонять под Windows, ибо:

  1. Даже если ваш сервер работает на *nix, многие разработчики по прежнему живут под Windows, и основная DVCS-работа идет именно у разработчиков под Windows.
  2. Производительность под виндами точно должна отличаться.
DVCS-benchs.png

См. #Условия тестов

Когда?

Истории использования

Kelly O'Hair

Мне удалось расспросить Kelly O'Hair из Sun на тему его выбора Hg для OpenJDK.

Question.svg Я прочел причины перехода с TeamWare на Mercurial, но остались вопросы. Вы просто последовали за выбором проекта OpenSolaris?

Note.svg Ну, в некоторой степени да, но выбор для OpenSolaris стал также очень распространенным выбором в Sun для всех команд разработчиков желающих куда-нибудь смигрировать. Исследование для OpenSolaris было впечатляюще исчерпывающим, и их требования в точности совпадали с нашим. Ну а так как нам надо было куда-то переезжать с OpenJDK, т.к. TeamWare для open-source проекта не подходит, выбор Mercurial стал для нас вполне очевидным.

Question.svg А вы пробовали освежить сравнение, и снова попробовать другие DVCS-системы (git, и т.п.)?

Note.svg Нет, мы не занимались перепроверкой, это наверно пустая трата времени. Единственной альтернативной на мой взгляд был git, но там не уделяли достаточно внимания работоспособности под Windows, а это нам было нужно. Так что повторюсь, выбор был очевиден.

Question.svg Так ведь отчету для OpenSolaris, который был опубликован в апреле 2006, уже два года стукнуло…

Note.svg Да знаю я. Что-то поменялось, git обновился, но Земля вертится, и Mercurial тоже улучшился.

Question.svg Какие особые проблемы встретились вам при миграции?

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

Еще мы столкнулись с проблемой, что использование триггеров (hooks) для отката или фильтрации push-изменений создает некоторое временное окно, в течении которого кто-то может вытащить (pull) изменения, которые должны быть откачены. В результате мы завели пару репозитариев — один для публикации изменений (push), другой — для извлечения (pull), и настроили между ними автоматическую синхронизацию, которая срабатывала после выполнения всех триггеров.

Использование лесов (forests) также приводило к проблемам, т.к. forest-push по сути набор отдельных push-операций, и если одна из них падает, то по уму надо бы откатить и все остальные. Однако никто этого не делает, все надеются на удачу. Впрочем, если репозитории в лесе достаточно независимы, это не будет реальной проблемой.

Question.svg И как оно в повседневном использовании?

Note.svg Поживем — увидим. Такие изменения кому-то даются легко, кому-то — тяжело. Дайте время, я думаю большинство привыкнет и даже выучится это любить.

Понятие «рабочих наборов файлов» (working set files, с чем работает hg update) и необходимость интеграции changeset-ов, которые непонятно с чем сливать, путает народ. Также идея пересылать changeset-ы а не отдельные файлы, для некоторых людей приводит к проблеме «Почему нельзя просто переслать вот этот вот один файл?».

Question.svg И чем это лучше, чем TeamWare?

Note.svg Много-много-много быстрее чем TeamWare. В перспективе наши команды в Китае и России перейдут на единую инфраструктуру сборки и интеграции, так как им не потребуется держать зеркала для серверов интеграции. Обновления (pulls) очень быстры даже при медленных соединениях.

Состояние репозитория в Mercurial достаточно целостное, в отличие от TeamWare, который разрешал частичные workspac-ы, да и вообще TeamWare всего лишь дырявая авоська с индивидуально учитываемыми (SCCS-) файлами.

Понятие набора изменений (changeset) в TeamWare отсутствует, вместе с понятием определенного состояния репозитария целиком (т.е. просто id-а, changeset-а).

Question.svg Так есть что-то, что вам не хватает от TeamWare?

Note.svg Ребятам не хватает оповещений через email, и еще истории транзакций «putback/bringover», хотя многое из этого можно вытащить из changeset. Возможно еще не хватает чего-то типа истории транзакций с репозиторием, но опять таки, почтовых архивов событий от Mercurial было бы достаточно.

Question.svg Так Hg стал избранной Sun-ом СУВ для всего, включая внутренние проекты? Или Sun использоует ее только для публичных проектов, которым требуется открытость?

Note.svg Да мы все проекты переносим, как внутренние, так и внешние, там где это имеет смысл разумеется. Вижу, что растет интерес решившихся на это проектов.

Pierre d'Herbemont

Также мне удалось расспросить на тему git и Pierre d'Herbemont из VLC.

Question.svg Для начала, какую систему управления версиями вы использовали до git?

Note.svg SVN, затем зеркало git-svn.

Question.svg А когда вы мигрировали?

Note.svg Мы открыли git-зеркало для svn-репозитория, чтобы облегчить участие VLC в Google Summer of Code. Это что предшествало этому. Затем мы полностью мигрировали на git 1-2го марта 2008.

Question.svg А почему вы выбрали Git, а не его конкурентов?

Note.svg По пунктам:

  • Лучше SVN: Git быстр. Ветка дешевая. Атомарные коммиты[17]. Можно делать rebasing относительно вершины другого дерева.
  • Лучше других DVCS: Проверенная пользовательская база (Linux Kernel). Я успешно использовал его, когда работал над Wine. Git sexy. И несколько ключевых разработчиков имело опыт с Git, и никто с Mercurial или чем-то подобным. Вобщем, тут не технические соображения сработали.

Question.svg Были у вас какие-нибудь специфические проблемы с миграцией? А с ежедневным использованием?

Note.svg Были проблемы с Trac и buildbot. У них поддержка Git была минимальной, особенно в их релизных версиях. Нам пришлось вытаскивать последние версии Builbot из исходников. Для Trac мы использовали убогий Git-плагин, который требовал Trac 0.11. Но Trac 0.11 еще не стабилен, там есть несколько известных утечек памяти, которые удерживают нас от переключения. В общем, мы ждем, когда они это починят...

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

И многие git-ньюбы начинают действительно им наслаждаться.

Ну и что?

Выбор между распределенными и централизованными СУВ далек от простоты. DVCS определенно изменят практику вашей работы, как индивидуальной, так и командной.

Subversion, один из лидеров CVCS не сдается[18] и в производительности, и по функционалу и версия 1.5 уже должна быть неплохим компромиссом. Он может рассчитывать на существущих пользователей и дух простоты (за счет некоторых неудобств). В определенных случаях, как например в работе с большими бинарными файлами, Subversion должен быть лучше, чем DVCS т.к. пространство под рабочии копии остается неизменным. Также он эффективней, если вы активно используете частичные checkout-ы, (хотя если это происходит часто — это явная проблема недостаточного разбиения вашего проекта на модули).

Даже если вы сделаете свой выбор в пользу DVCS или CVCS, то будет сложно сравнить конкурентов в выбранной области, т.е. реализация (например, команды) и соответственно их производительность, будет существенно отличаться. Нет ни одного теста производительности даже для общих операций. В этой жесткой битве, Bazaar потерял многих, очень важных и влиятельных ранних пользователей-энтузиастов (Mozilla, Solaris, OpenJDK) из-за плохой начальной производительности. Еще стоит заметить, что вебсайт Bazaar был слишком «маркетинговым»: публиковались не совсем честные сравнения с конкурентами, или тесты производительности по отдельным параметрам, в которых система превосходила конкурентов (см. например Space efficiency), при том, что не было сравнений по времени для ежедневных команд: diff, add, ... Мне кажется, что хотя все эти три проекта стартовали примерно в одно и то же время, bzr с самого начала столкнулся с множеством проблем в производительности и архитектуре, что привело к тому, что он сейчас чуть менее зрел и надежен, чем его конкуренты.

И еще ранее не наблюдавшийся феномен — похоже, что многие делают выбор в зависимости от языка программирования сообщества:

  • Java и разработка связанная с Sun более интересуется Mercurial
  • C/Linux/Ruby/Rails -проекты сооблазняются git.

Надеюсь, эта статья вас просветила, и я всегда рад узнать о вашем опыте и иным отзывам!

Благодарности

Благодарю тех, кто любезно согласился на мое интервью: Kelly O'Hair, Pierre d'Herbemont. Ian Clatworthy за его оперативную помощь в преобразовании hg-репозитория Mozilla в Bzr.

IRC-каналы #git, #mercurial, #bzr на Freenode IRC, #mozilla на Mozilla IRC. Картинка с бегунами от Antonio Juez.

Случайные цитаты

Linus Torvald
  • «Subversion has been the most pointless project ever started».
  • «If you like using CVS, you should be in some kind of mental institution or somewhere else»[19].
Mark Shuttleworth (Ubuntu / Canonical Ltd.)
  • «Merging is the key to software developer collaboration».
Ian Clatworthy (Canonical / Bazaar)
  • «By 2011-2012, I predict this technology will be widely adopted and many teams will wonder how they once managed without it.»
Assaf Arkin в Git forking for fun and profit originally
«Apache built a great infrastructure around SVN, lots of sweat and tears went into making it happen, and at first I felt like we’re circumventing all of that. But the longer I thought about it, the more I realized that Git is just more social than SVN, and that’s exactly what Apache is about.»

Статья была обновлена 2008-05-12 после коммантариев от Ian Clatworthy и портала reedit.

  • Добавлены плагины Bzr и Windows GUI: rebase, ..., Wildcat BZR, ...
  • Добавлен Hg Shelve.
  • Обновлены SLOC для Hg (надо было еще учесть HTML-документацию, и оставил contrib, отвественный за поддержку Lisp и Tcl/Tk).
  • Обновлен размер репозитория для git после правильной команды repack (git repack -a -f -d --window=100 --depth=100 после которой размер стал постоянным) (Спасибо за комментарий dhamma vicaya).

Извинения

darcs, Monotone! Простите, что не рассматривал вас в этом сравнении, т.к. мне и так пришлось неслабо поработать чтобы собрать всю эту информацию и протестировать эти три DVCS. Да, странно получилось, что хотя вы самые старые на DVCS-сцене, актуальны теперь в основном те DVCS, которых я рассматривал тут (конечно, вряд ли эта ситуация измениться, но добро пожаловать пользователям darcs и Monotone с комментариями и рекламой!).

Ссылки

Distributed Revision Control Wikipedia page. Comparison of Revision Control Software Wikipedia page.

Ну и все URLы, так или иначе упомянутые в этой статье.

Шпаргалки

Условия тестов

Benchmark conditions

Тесты были проведены с использованием:

  • AMD Athlon(tm) 64 Processor 3500+
  • 1GB RAM
  • Linux Kubuntu 6.10 Edgy x86_64 with ext3 fs.

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

Использовались следующие версии:

Репозиторий содержал слепок из 12456 changeset-ов (от 20080303, 70853 полных версий из hg-репозитория), ≈30000 файлов из репозитория Mozilla (изначально они были в hg-формате и сконвертированы в git-репозиторий с помощью hg-fast-export.sh, и в Bazaar-репозиторий с помощью hg-fast-export.sh плюс плагин fast-import). Для репозиториев использовались файловые форматы по умолчанию, и размер репозитория git оставался постоянными, при запуске git-gc (что в общем, считается нормальным для свежемигрировавшего репозитория). Правился один файл (dom/src/base/nsDOMClassInfo.cpp), точно как в тесте проводимом Jst полтора года назад.

Примечания

  1. Появилось в версии 1.6 (примечание переводчика).
  2. Подпись происходит автоматически, но проверка полуручная http://bazaar-vcs.org/BzrGpgSigning
  3. Есть начиная с версии 1.14 http://doc.bazaar-vcs.org/bzr.1.14/en/release-notes/NEWS.html#bzr-1-14
  4. См.
  5. Промежуточные области, staging area или index — оригинальная концепция git, расширяющее стандартный двудольный подход РабочаяКопия-Репозитарий, еще одной промежуточной областью, в которой можно решать в какие именно изменения и в каком порядке пойдут в репозитарий: index1.png http://gitready.com/beginner/2009/01/18/the-staging-area.html
  6. Заброшенные объекты — dangling objects (слепки файлов, так и не ставших частью ни одного коммита, см. http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#dangling-objects)
  7. Detached heads — концепция работы не с последними версиями каждой ветви, а с произвольными коммитами на стволе. http://sitaramc.github.com/concepts/detached-head.html
  8. plumbing vs porcelain — вероятно автор имел ввиду существование низкоуровнего, сантехнически-канализационного уровня git, для построения собственного фреймворка управления версиями, так и высокоуровнего «мойдодырного» пользовательского уровня
  9. reflogs — http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html
  10. См. например Test Case. Переводчик экспериментировал с
    • svn 1.6.6
    • bzr 2.0.2
    • hg 1.4.1
    • git 1.6.5.2
    • darcs 2.3.0
    git и svn тест не прошли.
  11. Появился и развивается «черепаховый» интерфейс — TortoiseGit
  12. Все развивается, более того, TortoiseBzr входит в стандартный windows-дистрибутив Bzr
  13. Увы, проект https://launchpad.net/wildcat-bzr похоже заброшен.
  14. http://freehg.org/ увы помер, но вместо него есть http://bitbucket.org/ !
  15. Ruby добавлен в отчет 2008 года, и показал там очень большой результат — второе место с 43% (См. [1])
  16. Пошлая шутка от переводчика — «…согласно опросу среди любителей группового секса, 70 % имеет 1 полового партнера, а 29.9 % оставшихся — 0…»
  17. Удивительная претензия к SVN, в котором это есть (примечание переводчика).
  18. Мы сделали переводы этих статей, см. Категория:Статьи о Subversion
  19. См. наш перевод этой речи Линуса Торвальдса — Линус Торвальдс о GIT на Google Talks



Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».

Репликация: База Знаний «Заказных Информ Систем» → «Distributed Version Control Systems: A Not-So-Quick Guide Through»