http://lib.custis.ru/api.php?action=feedcontributions&user=Bogolt&feedformat=atomCustisWiki - Вклад участника [ru]2024-03-29T02:06:55ZВклад участникаMediaWiki 1.26.4http://lib.custis.ru/index.php?title=Distributed_Version_Control_Systems:_A_Not-So-Quick_Guide_Through&diff=11326Distributed Version Control Systems: A Not-So-Quick Guide Through2009-10-28T23:33:33Z<p>Bogolt: гит уже есть и в СорсФордже - добавил в таблицу</p>
<hr />
<div>Перевод статьи «[http://www.infoq.com/articles/dvcs-guide Distributed Version Control Systems: A Not-So-Quick Guide Through]» от ''Sebastien Auvray'' с портала InfoQ.<br />
<br />
[[Image:3-atlets-on-start.jpg|right|200px]]<br />
<br />
{{note}} Sébastien Auvray — senior software designer и энтузиаст технологий. Его заставляли использовать [[CVS]] и [[SVN]], теперь он страдает на работе от ежедневного использования Perforce. Sébastien также один из редакторов InfoQ по теме Ruby.<br />
<br />
<br />
{{caution}} К моменту перевода прошел уже год, и многие положения статьи изменились — самые очевидные исправлены переводчиком ([[Участник:StasFomin|Стас Фомин]]) (в частности, исправлены битые ссылки), часть снабжены сносками, указывающими на произошедшие изменения.<br />
<br />
После [[Линус Торвальдс о GIT на Google Talks|выступления Линуса Торвальдса в Google]] в мае 2007, просвященного GIT, постоянно растет интерес и число пользователей распределенных систем контроля версий (''Distributed Version Control Systems'', DVCS).<br />
<br />
Тут мы сначала сделаем краткое введение в понятия распределенного управления версиями, посмотрим, когда это стоит использовать, и почему, этом может быть лучше, чем то, что вы используете сейчас, и затем мы взглянем на трех ключевых игроков в этой области: <tt>git</tt>, <tt>Mercurial</tt> и <tt>Bazaar</tt>.<br />
<br />
== Так что же это? ==<br />
<br />
Системы управления версиями (СУВ, SCM, ''Source Control Management'') следят за всеми версиями каждой информационной единицы.<br />
Обычно они используются в разработке ПО для ведения исходных кодов проекта.<br />
Самой древней из широко известных СУВ была [[CVS]], разработка началась в 1986 году.<br />
<br />
С тех пор выросло множество СУВ, различным образом улучшающих CVS:<br />
* [http://subversion.tigris.org/ Subversion] (2000);<br />
* [http://www.perforce.com/ Perforce] (1995);<br />
* [http://www.march-hare.com/cvspro/ CVSNT] (1998)…<br />
<br />
[[Image:braches-in-vcs.png|left]]<br />
<br />
В декабре 1999, для ведения основного ствола исходников Ядра Линукса Линус выбрал [http://www.bitkeeper.com/ BitKeeper], характеризовав его как «Лучший инструмент для этой работы».<br />
<br />
До этого, Линус вообще вручную интегрировал изменения из отдельных патчей.<br />
<br />
Все предшественники ''BitKeeper'' работали в централизованной модели «Клиент—(Центральный)Сервер», и ''BitKeeper'' был первой VCS разрешивший полную распределенность, когда каждый имеет собственный репозиторий. Но из-за лицензионных конфликтов, ''BitKeeper'' был отринут в пользу [http://git.or.cz/ git] (апрель 2005).<br />
<br />
Теперь есть и другие системы, использующие ту же модель:<br />
<br />
* [http://www.selenic.com/mercurial/wiki/ Mercurial] (апрель 2005);<br />
* [http://bazaar-vcs.org/ Bazaar] (март 2005);<br />
* [http://darcs.net/ darcs] (ноябрь 2004);<br />
* [http://monotone.ca/ Monotone] (апрель 2003).<br />
<br />
== Зачем все это? ==<br />
<br />
Или даже более конкретно: «А чем не устраивают CVCS (Централизованные СУВ)? Subversion-то чем не угодил?»<br />
<br />
Вот в чем обвиняют <tt>Subversion</tt>:<br />
* Главное: ветвится стало легко, но слияние-то по-прежнему мучительно (а ведь зачем «ветвление без слияний?»). Наверняка во всех проектах вам придется развлекаться с ветками разработки и тестирования. А у <tt>Subversion</tt> нет «безопасного повторного» слияния, пользователей заставляют вручную отслеживать интервалы ревизий, которые уже были интегрированы в другие ветки, и все это разумеется подвержено ошибкам.<br />
* Никак не послать изменения другому пользователю минуя центральный сервер.<br />
* ''Subversion'' не может интегрировать измененения при переименовании файлов или каталогов<ref>Появилось в версии 1.6 (примечание переводчика).</ref>.<br />
* Нужно специально придерживаться «trunk/tags/branches»-соглашения о ветках (См. [http://www.jroller.com/bokmann/entry/questioning_subversion_practices misleading]).<br />
* Нет оффлайн-коммитов.<br />
* Подкаталоги <code>.svn</code> замусоривают рабочую копию.<br />
* Обработка свойства <code>svn:external</code> может быть опасна.<br />
* Производительность: [http://wiki.netbeans.org/HgMigrationReasons Performance]<br />
<br />
Современные DVCS-системы все это исправили, как собственными фишками реализации, так и самой идеологией распределенности.<br />
<br />
Но, как мы увидим дальше, <tt>Subversion</tt> еще не сдается!<br />
<br />
== Как? ==<br />
<br />
=== Децентрализация ===<br />
<br />
Распределенные системы управления версиями выигрывают за счет «peer-to-peer»-подхода.<br />
Участники могут взаимодействовать друг с другом и поддерживать их локальные ветки без необходимости в центральном сервере и даже репозитории. То есть синхронизация идет между равными участниками, самостоятельно решившими, какими изменениями обменяться.<br />
<br />
[[Image:CVCSvsDVCS.png|center]]<br />
<br />
Это приводит к сущетвенным отличиями и преимуществам над централизованными системами:<br />
;По умолчанию нет канонической, рекомендованной копии: только рабочие копии.<br />
;Оффлайн операции: Большинство операций, таких как коммиты, просмотр истории или различий, откат изменений становятся быстрыми, ибо не нужно взаимодействие с центральным сервером.<br />
<br />
Даже если есть какой-нибудь центральный сервер (например, для релизов, бэкапов или стандартных версий), если правильно задействовать ''Распределенность'', его не будут так же часто дергать, как в случае CVCS.<br />
<br />
* Каждая рабочая копия на самом деле представляет собой полный бэкап всех исходников '''с историей правок''', в общем, естественным образом образовалась надежность от потери данных.<br />
* Экспериментальные ветки — ветки очень просто и быстро создаются и уничтожаются.<br />
* Участникам легко взаимодействовать друг с другом.<br />
<br />
Для введения в непосредственно практики DVCS-разработки, можете взглянуть на статьи<br />
[http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/ Intro to Distributed Version Control (Illustrated)] или возможно [http://bazaar-vcs.org/Workflows Collaboration workflows].<br />
<br />
С другой стороны, стоит предупредить вас о некоторых проблемах выбора DVCS, особенно о проблеме сложности использования: этот децентрализованный подход весьма отличается от старого доброго Централизованного Мира, и может потребоваться время, чтобы ваши разработчики смогли им воспользоваться. Отслеживание наборов изменений (''changeset'') вместо ведения истории файлов тоже может запутать, несмотря на свою мощность, благодаря которой он сможет отслеживать такие вещи, как перемещение функции между файлами.<br />
<br />
== Кто? ==<br />
А теперь ''контрольверсийсрач''!<br />
«Что такое хорошо, и что такое плохо».<br />
<br />
Все эти плюсы и минусы собраны в основном из (вычитанной и проверенной, ибо многие аргументы устаревали) компиляции блогов и личного опыта.<br />
<br />
{{caution}} Учтите, что это весьма краткий лист свойств (например, у <tt>git</tt> более 150 команд), и что важность их разная.<br />
<br />
Для простоты, приведем сначала общие свойства всех трех систем:<br />
* Модель конкурентного взаимодействия: «Слияние»<br />
* Лицензия: GPL<br />
* Бесплатны<br />
* Основные возможности:<br />
** Атомарные коммиты<br />
** Слияния переименований файлов<br />
** Поддержка симлинков<br />
** Пре- и пост- триггеры (''hooks'') на события<br />
** Отслеживание слияний<br />
** Теги<br />
<br />
Теперь приведем сводную таблицу различающихся свойств:<br />
<br />
{|style="border:1px dashed orange" border=1<br />
|<br />
| git<br />
| Mercurial<br />
| Bzr<br />
|-<br />
|<br />
| [[Image:git-logo.png]] http://git.or.cz/<br />
| [[Image:mercurial-logo.png]] http://www.selenic.com/mercurial/<br />
| [[Image:bzr-logo.png]] http://bazaar-vcs.org/<br />
|-<br />
| ГлавАвтор<br />
| ''Junio C Hamano''<br />
| ''Matt Mackall''<br />
| ''Canonical Ltd.'' (идет переход в GNU project)<br />
|-<br />
| Платформы<br />
| POSIX, Windows, Mac OS X<br />
| Unix-like, Windows, Mac OS X<br />
| Unix-like, Windows, Mac OS X<br />
|-<br />
| Версия<br />
| {{Ok}} > 1.0 (1.6.5.1)<br />
| {{Ok}} > 1.0 (1.3.1)<br />
| {{Ok}} > 1.0 (2.0.0)<br />
|-<br />
| Запуск проекта<br />
| апрель 2005<br />
| апрель 2005<br />
| март 2005<br />
|-<br />
| Реализация<br />
|<br />
|<br />
|<br />
|-<br />
| SLOC (без тестов)<br />
| [[Image:git-sloc.png]]<br />
| [[Image:hg-sloc.png]]<br />
| [[Image:bzr-sloc.png]]<br />
|-<br />
| SLOC Count<br />
| 130550<br />
| 38172<br />
| 79864<br />
|-<br />
| Покрытие тестами (% исходников относящихся к тестам)<br />
| {{Ok}} ~20 %<br />
| {{Ok}} ~25 %<br />
| {{Ok}} ~50 %<br />
|-<br />
| Модель истории<br />
| ''Snapshot''<br />
| ''Changeset''<br />
| ''Snapshot''<br />
|-<br />
| Рост репозитория<br />
| ''O(patch)''<br />
| ''O(patch)''<br />
| ''O(patch)''<br />
|-<br />
| Сетевые протоколы<br />
| HTTP, FTP, email bundles, custom, ssh, rsync<br />
| HTTP, ssh, email<br />
| HTTP, SFTP, FTP, ssh, custom, email bundles<br />
|-<br />
| Подпись ревизий<br />
| {{Ok}}<br />
| {{Ok}}<br />
| {{Caution}} Частично/Ручная проверка<ref>Подпись происходит автоматически, но проверка полуручная http://bazaar-vcs.org/BzrGpgSigning</ref><br />
|-<br />
| Слияние изменений<br />
| {{Ok}}<br />
| {{Ok}}<br />
| {{Ok}}<br />
|-<br />
| EOL-соглашения<br />
| {{Ok}}<br />
| {{Ok}}<br />
| <s>{{No}} Запланировано в 1.6</s>{{Ok}}<ref>Есть начиная с версии 1.14 http://doc.bazaar-vcs.org/bzr.1.14/en/release-notes/NEWS.html#bzr-1-14</ref><br />
|-<br />
| Интернационализация<br />
| {{No}}<br />
| {{No}} [http://www.selenic.com/mercurial/wiki/index.cgi/InternationalizationPlan Запланировано]<br />
| {{Ok}}<br />
|-<br />
| Частичный checkout<br />
| {{No}} Используйте вместо этого подмодули<br />
| {{No}} Запланировано<br />
| {{No}} [http://bazaar-vcs.org/FilteredViews Запланировано]<br />
|-<br />
| Модель / Архитектура<br />
|<br />
|<br />
|<br />
|-<br />
| Файлы<br />
| Один подкаталог <code>.git</code> вверху<br />
| Один подкаталог <code>.hg</code> вверху<br />
| Один подкаталог <code>.bzr</code> вверху<br />
|-<br />
| Модель<br />
|<br />
| Простая модель ветвлений (ветка=клон)<br />
| Простая модель ветвлений (ветка=клон)<br />
|-<br />
| Особенности репозиториев<br />
|<br />
|<br />
| Разделяемые репозитории для совместного использования ревизий в разных ветках [http://bazaar-vcs.org/BzrVsGit Supposed-to-be Better Storage Model]<br />
|-<br />
| Версионирование каталогов<br />
| {{No}}<br />
| {{No}}<br />
| {{Ok}}<br />
|-<br />
| Подмодули<br />
| {{Ok}} <code>[http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html git-submodule]</code><br />
| {{Ok}} [http://www.selenic.com/mercurial/wiki/index.cgi/ForestExtension Forest extension] ([http://blogs.sun.com/kto/entry/openjdk_mercurial_forest as used by OpenJDK]<br />
| {{Caution}} Решаемо через сторонние инструменты [http://bazaar-vcs.org/ConfigManager ConfigManager]<br />
|-<br />
| Индивидуальные коммиты для отдельного файла<br />
| {{No}} Противоречит архитектуре<br />
| {{No}} Противоречит архитектуре<br />
| {{No}} Противоречит архитектуре<br />
|-<br />
| Rebase/Queue<br />
| {{Ok}} [http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html <code>rebase</code>]<br />
| {{Ok}} [http://www.selenic.com/mercurial/wiki/index.cgi/MqExtension Mercurial Queues]<br />
| {{Ok}} [http://bazaar-vcs.org/Rebase Rebase plugin], [http://blogs.gnome.org/jamesh/2008/04/01/bzr-loom/ Loom plugin] ([http://bazaar-vcs.org/Documentation/LoomAsSmarterQuilt comp. with Quilt])<br />
|-<br />
| Web-доступ<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Ok}} {{Note}} Read-only доступ можно дать публикацией статических файлов по HTTP.<br />
| {{Ok}} {{Note}} Read-only доступ можно дать публикацией статических файлов по HTTP.<br />
| {{Caution}} Не так хорошо. Теперь доступен более быстрый [http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html#running-a-smart-server Smart Server].<br />
|-<br />
|<br />
| gitweb, wit, cgit<br />
| hgweb (single rep), hgwebdir (multi rep)<br />
| webserve, trac, [http://www.lag.net/loggerhead/ Loggerhead]<br />
|-<br />
| Интеграция<br />
|<br />
|<br />
|<br />
|-<br />
| Интеграция (API)<br />
| {{No}} Скорее скриптуем, чем API-интегрируем (хотя есть некий заброшенный API-frontend: [http://repo.or.cz/w/rubygit.git Ruby/Git])<br />
| {{Ok}}<br />
| {{Ok}} Богатый API<br />
|-<br />
| Миграция<br />
| {{Ok}} Хороша. <code>[http://www.kernel.org/pub/software/scm/git/docs/git-svn.html git-svn]</code> тоже весьма мощная штука, представляет двухсторонний прокси между ''Subversion'' и ''Git'', позволяет исползовать ''Git'' поверх существующего репозитория ''Subversion''.<br />
| {{Ok}} Хороша. Но <code>[http://pypi.python.org/pypi/hgsvn hgsvn]</code> не настолько отлажен, как <code>git-svn</code>.<br />
| {{Caution}} Неплохо реализована, но медленная.<br />
|-<br />
| Интеграция с ''Issue''-трекерами<br />
| {{Caution}} Есть для [[Trac]], паллиатив для [[Bugzilla]]. Для [[JIRA]] увы нет.<br />
| {{Ok}} Есть для [[Trac]], [[Bugzilla]], [[JIRA]].<br />
| {{Caution}} Есть для [[Trac]] и [[Bugzilla]], нет для [[JIRA]].<br />
|-<br />
| Плагины к IDE<br />
| {{Ok}} <tt>Idea</tt>, <tt>Eclipse</tt>, <tt>NetBeans</tt><br />
| {{Ok}} <tt>Idea</tt>, <tt>Eclipse</tt>, <tt>NetBeans</tt><br />
| {{Caution}} <tt>Idea</tt>, <tt>Eclipse</tt>. Нет для <tt>NetBeans</tt><br />
|-<br />
| Плагины<br />
| {{Ok}} <tt>Emacs</tt> / <tt>Vim</tt> / …<br />
| {{Ok}} <tt>Emacs</tt> / <tt>Vim</tt> / …<br />
| {{Ok}} <tt>Emacs</tt> / <tt>Vim</tt> / …<br />
|-<br />
| Производительность<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Ok}} <tt>git</tt> всегда был быстрее<br />
|<br />
| {{No}} <tt>bzr</tt> всегда самый медленный из этой троицы.<br />
|-<br />
| Навороты<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Ok}} С 150 выполняемыми файлами-командами нетрудно найти любую суперкоманду, о которой вы всегда мечтали (хотя это конечно увеличивает сложность)<br />
|<br />
|<br />
|-<br />
| Сложность<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
|<br />
|<br />
| <tt>Bzr</tt> декларирует скрытие сложности поддержанием четкого и ясного пользовательского интерфейса, при этом адаптируясь к различным моделям взаимодействия [http://bazaar-vcs.org/Workflows workflows] и даже их эволюции в каждой команде.<br />
|-<br />
| Именование версий/ревизий<br />
| {{No}} Ревизии — SHA-1 хеши, что не особо юзер-френдли, если например, запрашивать различия между версиями. Так сделано, чтобы гарантировать надежность и целостность данных, а также чтобы избежать конфликтов при слиянии с другими участниками.<br />
| {{Ok}} Простое именование<br />
| {{Ok}} Простое именование: <tt>r1</tt>, <tt>r2</tt>, <tt>etc</tt>…<br />
|-<br />
| Команды<br />
| {{Caution}} Понятные, за рядом исключений типа команды <code>rename</code>, которая отличается от других SCM (и уже не поменяют из-за поддержки обратной совместимости). <tt>git</tt> это наиболее навороченная по командам СУВ, но очень сложно овладеть полным набор всех его команд и опций.<br />
Существование инструментов типа [http://www.gnome.org/%7Enewren/eg/ Easy Git] только подтверждает исключительную сложность <tt>Git</tt>.<br />
| {{Ok}} Понятные (похожие на команды <tt>Subversion</tt>)<br />
| {{Ok}} Понятные<br />
|-<br />
| Число пользователей<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Ok}} Большое / Много (и крупных) проектов на <tt>git</tt><ref>См.<br />
* http://git.or.cz/gitwiki/GitSurvey2007<br />
* http://git.or.cz/gitwiki/GitSurvey2008<br />
* http://git.or.cz/gitwiki/GitSurvey2009</ref><br />
| {{Ok}} Большое / Много (и крупных) проектов на <tt>hg</tt>.<br />
| {{No}} Меньше предыдущих: кроме проектов Canonical (Ubuntu, Launchpad), особо крутых проектов нет.<br />
|-<br />
|<br />
| Linux kernel, Cairo, Wine, X.Org, Rails, Rubinius, Compiz Fusion<br />
| Xine, OpenJDK, OpenSolaris, NetBeans, (Part of) Mozilla<br />
| Ubuntu (частично), Launchpad<br />
|-<br />
| Документация<br />
| {{Ok}} Хороша. Хороший <tt>man</tt> с кучей примеров.<br />
| {{Ok}} Хороша.<br />
| {{Ok}} Хороша.<br />
|-<br />
| Платформы<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Caution}} Плохая Windows-поддержка<br />
| {{Ok}} Кроссплатформенный<br />
| {{Ok}} Кроссплатформенный<br />
|-<br />
| {{Ok}} Полезные особенности<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| <tt>git</tt> скорее скриптуем, чем расширяем, что с одной стороны хорошо, а с другой — плохо. Легко использовать из скрипта, например, все тесты можно сделать из <tt>bash</tt>. Весьма настраиваем в продвинутом администрировании:<br />
* Промежуточные области <ref>Промежуточные области, ''staging area'' или ''index'' — оригинальная концепция <tt>git</tt>, расширяющее стандартный двудольный подход РабочаяКопия-Репозитарий, еще одной промежуточной областью, в которой можно решать в какие именно изменения и в каком порядке пойдут в репозитарий: http://whygitisbetterthanx.com/images/index1.png http://gitready.com/beginner/2009/01/18/the-staging-area.html</ref>,<br />
* Заброшенные объекты <ref>Заброшенные объекты — ''dangling objects'' (слепки файлов, так и не ставших частью ни одного коммита, см. http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#dangling-objects)</ref>,<br />
* detached heads<ref>''Detached heads'' — концепция работы не с последними версиями каждой ветви, а с произвольными коммитами на стволе. http://sitaramc.github.com/concepts/detached-head.html</ref>,<br />
* plumbing vs porcelain<ref>''plumbing vs porcelain'' — вероятно автор имел ввиду существование низкоуровнего, сантехнически-канализационного уровня <tt>git</tt>, для построения собственного фреймворка управления версиями, так и высокоуровнего «мойдодырного» пользовательского уровня</ref>,<br />
* reflogs <ref>reflogs — http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html</ref>.<br />
<br />
Возможны локальные (внутрирепозитарные) ветки.<br />
| [http://www.markshuttleworth.com/archives/126 Robust Renaming].<br />
| [http://www.markshuttleworth.com/archives/126 Robust Renaming]. Поддержка легких ''checkouts'' (без истории). [http://bazaar-vcs.org/BzrUsingBoundBranches Bound branches]. Возможны локальные (внутрирепозитарные) ветки. [https://launchpad.net/pqm Patch Queue Manager] (управление несколькими ветками, выполнение слияний для разработчиков)<br />
|-<br />
| {{Ok}} Несколько крутых команд/расширений<br />
|<br />
* <code>[http://www.kernel.org/pub/software/scm/git/docs/git-stash.html git-stash]</code> (поддержка прерывания для краткого баг-фикса в другом проекте),<br />
* <code>[http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html git-cherry-pick]</code> (для выбора отдельных коммитов, без полных веток),<br />
*<code>[http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html git-rebase]</code> «Quilt-like changeset» типа [http://www.selenic.com/mercurial/wiki/index.cgi/MqExtension Mercurial Queues]).<br />
*<code>git add -i</code> аналог ''Mercurial RecordExtension''. <br />
Похоже тут есть все команды, которые вы бы могли захотеть.<br />
|<br />
<br />
* [http://www.selenic.com/mercurial/wiki/index.cgi/RecordExtension RecordExtension] — позволяет выбрать, какую часть изменений рабочего каталога вы собираетесь закоммитить.<br />
* [http://www.selenic.com/mercurial/wiki/index.cgi/ShelveExtension Hg Shelve Extension] — аналог <tt>git-stash</tt>: — интерактивно выбрает изменения, чтобы их «обойти».<br />
|<br />
<br />
* [https://launchpad.net/shelf Shelf] — аналог <tt>git-stash</tt>: поддержка прерывания для краткого баг-фикса в другом проекте, но похоже помирает — последнее изменение в марте 2007.<br />
* [https://launchpad.net/bzr-dbus bzr-dbus] — для броадкаста ревизий и триггеров.<br />
|-<br />
| {{No}} Проблемы<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
|<br />
<br />
* [http://www.markshuttleworth.com/archives/126 Переименование не так хорошо, как в bzr] ([http://automatthias.wordpress.com/2007/06/07/directory-renaming-in-scm/ Test Case]).<br />
* Настройка статического <tt>read-only</tt> HTTP-доступа слегка туповата (<tt>--bare</tt> и <tt>update-server-info</tt>).<br />
* Обработка файлов в ''Unicode'' (UTF-16).<br />
* Модель хранения. <tt>Git</tt> хранит каждый отдельный объект как отдельный файл, без обязательного вычисления дельты между ревизиями (это делает отдельная команда). Обязательно настройте, чтобы регулярно запускалась команда <tt>pack</tt>.<br />
* Мешанина из <tt>C</tt>, <tt>Perl</tt> и скриптов на <tt>bash</tt>, что очень затрудняет полноценный перенос на другие системы.<br />
|<br />
<br />
* <s>[http://www.markshuttleworth.com/archives/126 Renaming not handled as good as bzr]. [FIXED]</s><br />
* Нет локальных веток, нужно использовать клон. Чтобы сэкономить место, <tt>Hg</tt> использует ''hardlinking'', из-за чего возникают проблемы при <tt>pull</tt> (и еще под Windows).<br />
* Расширение «Forest» (для подмодулей) неродное, и плохо документировано.<br />
|<br />
|-<br />
| GUI<br />
|<br />
|<br />
|<br />
|-<br />
| Windows<br />
| {{No}}<br />
| {{Ok}} [http://www.selenic.com/mercurial/wiki/index.cgi/TortoiseHg TortoiseHg]<br />
| {{Caution}} Сложновато. <s>TortoiseBzr (нет коммитов после Aug 2007, хотя проект пока [http://doc.bazaar-vcs.org/bzr.dev/developers/tortoise-strategy.html жив])</s><ref>Все развивается, более того, TortoiseBzr входит в стандартный windows-дистрибутив Bzr</ref>. <s>[http://sorn.net/blog/2008/04/Windows-Installer-for-Wildcat-BZR WildcatBZR]</s><ref>Увы, проект https://launchpad.net/wildcat-bzr похоже заброшен.</ref>.<br />
|-<br />
| Linux<br />
| {{Ok}} <tt>gitk</tt>, <tt>git-gui</tt>, <tt>tig</tt>, …<br />
| {{Ok}} <tt>TortoiseHg</tt>, <tt>Hgtk</tt>, <tt>hgct</tt><br />
| {{Ok}} <tt>bzr-gtk</tt>, …<br />
|-<br />
| Инсталляция<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| {{Caution}} Нужен либо <tt>cygwin</tt> либо специальный <tt>git</tt>-дистрибутив типа [http://code.google.com/p/msysgit/ Git on MSys]<br />
| {{Ok}}<br />
| {{Ok}}<br />
|-<br />
| Бесплатные хостинги<br />
|<br />
|<br />
|<br />
|-<br />
|<br />
| [http://github.com/ GitHub], [http://gitorious.org/ gitorious], [http://sourceforge.net/ SourceForge]<br />
| <s>[http://freehg.org/ FreeHg]</s><ref>http://freehg.org/ увы помер, но вместо него есть http://bitbucket.org/ !</ref><br />
| [https://launchpad.net/ Launchpad]<br />
|}<br />
<br />
{{caution}} Полно еще споров, например, от том, что каталоги в <tt>Bzr</tt> это [http://bazaar-vcs.org/BzrVsGit#head-8d6788e5fb366d04efa536c4c41d4b36e67233fb ветки, а не контейнеры веток], как в <tt>git</tt>.<br />
<br />
<s>А то, что Mercurial использует внешние инструменты для слияний, [http://bazaar-vcs.org/BzrVsHg#head-a1fbb925120017d8d4b05a2da1eba9469ab48160 критикуют стороники Bazaar]</s>. Это исправлено с версии [http://www.selenic.com/mercurial/wiki/index.cgi/MergeToolConfiguration Mercurial v1.0].<br />
<br />
Есть и другие нексколько предвзятые сравнения от Bazaar-команды:<br />
* [http://bazaar-vcs.org/BzrVsGit Bazaar vs Git],<br />
* [http://bazaar-vcs.org/BzrVsHg Bazaar vs Mercurial]<br />
<br />
и соответственно, ответ на это:<br />
* [http://www.selenic.com/mercurial/wiki/index.cgi/BzrVsHg reply from Mercurial].<br />
<br />
[[Image:Gitsurvey.png|center|framed|Some User Statistics from Git Survey 2007]]<br />
<br />
{{caution}} Обратите внимание, что в этом отчете не было возможности выбрать ''Ruby'', неплохо было бы добавить его в опрос 2008 года<ref>Ruby добавлен в отчет 2008 года, и показал там очень большой результат — второе место с 43% (См. [http://git.or.cz/gitwiki/GitSurvey2008])</ref>.<br />
<br />
{{note}} Очень забавно, что треть людей используют DVCS взаимодействуюя с … 0 или 1 участниками!<ref>Пошлая шутка от [[User:StasFomin|переводчика]] — «…согласно опросу среди любителей группового секса, 70 % имеет 1 полового партнера, а 29.9 % оставшихся — 0…»</ref>.<br />
<br />
=== GUI ===<br />
<br />
Графический интерфейс ко всем системам хороший и примерно одинаковый, хотя <tt>gitk</tt> наверное эффективней.<br />
<br />
<tt>TortoiseHg</tt> (с активированной опцией «folder watch») сильно тормозит на больших репозиториях, типа Мозилловского.<br />
<br />
[[Image:gitk.png|center|framed|gitk on Linux]]<br />
[[Image:tortoise-hg.png|center|framed|TortoiseHg on Windows]]<br />
[[Image:olive-bzr-gtk.png|center|framed|OliveGtk on Linux]]<br />
<br />
=== Краткий взгляд на производительность (не претендует на истину в последней инстанции) ===<br />
<br />
<tt>git</tt> по прежнему лидирует в битве за производительность, но <tt>Hg</tt> и <tt>Bzr</tt> существенно улучшились за последний год.<br />
<br />
Обратите внимание, что Mercurial удваивает количество файлов в вашем репозитории (история хранится по-файлово в <code>.hg/store/data</code>).<br />
Это не шибко хороший выбор для Windows-систем, живущих на NTFS.<br />
<br />
Также интересно видеть, что у <tt>git</tt> большое преимущество за счет операционной системы при выполнении команд.<br />
<tt>Hg</tt> и <tt>Bzr</tt> не тратят большую часть времени в системных вызовах, а <tt>Git</tt> проводит в них до <tt>10-40 %</tt> времени.<br />
Возникает ожидаемый вопрос, о том, будет ли его производительность также хороша под Windows, где <tt>git</tt>-разработчики не имеют доступа к ко всем возможностям системы, как у них было под Linux.<br />
<br />
Надо тестировать как отдельные слияния, так и слияние очередями, это связанная часть тестов.<br />
<br />
Бенчмарки надо также гонять под Windows, ибо:<br />
# Даже если ваш сервер работает на <tt>*nix</tt>, многие разработчики по прежнему живут под Windows, и основная DVCS-работа идет именно у разработчиков под Windows.<br />
# Производительность под виндами точно должна отличаться.<br />
<br />
<br />
[[Image:DVCS-benchs.png|center]]<br />
<br />
См. [[#Условия тестов]]<br />
<br />
== Когда? ==<br />
<br />
=== Истории использования ===<br />
<br />
==== Kelly O'Hair ====<br />
Мне удалось расспросить [http://java.sun.com/developer/Meet-Eng/ohair/ Kelly O'Hair] из Sun на тему его выбора Hg для OpenJDK.<br />
<br />
{{question}} Я прочел [http://blogs.sun.com/kto/entry/mercurial_openjdk_questions причины] перехода с <tt>TeamWare</tt> на <tt>Mercurial</tt>, но остались вопросы. Вы просто последовали за выбором проекта ''OpenSolaris''?<br />
<br />
{{note}} Ну, в некоторой степени да, но выбор для ''OpenSolaris'' стал также очень распространенным выбором в Sun для всех команд разработчиков желающих куда-нибудь смигрировать. Исследование для ''OpenSolaris'' было впечатляюще исчерпывающим, и их требования в точности совпадали с нашим. Ну а так как нам надо было куда-то переезжать с ''OpenJDK'', т.к. ''TeamWare'' для open-source проекта не подходит, выбор ''Mercurial'' стал для нас вполне очевидным.<br />
<br />
{{question}} А вы пробовали освежить сравнение, и снова попробовать другие DVCS-системы (git, и т.п.)?<br />
<br />
{{note}} Нет, мы не занимались перепроверкой, это наверно пустая трата времени. Единственной альтернативной на мой взгляд был <tt>git</tt>, но там не уделяли достаточно внимания работоспособности под Windows, а это нам было нужно. Так что повторюсь, выбор был очевиден.<br />
<br />
{{question}} Так ведь [http://www.opensolaris.org/os/community/tools/scm/on-scm-tools/ отчету для ''OpenSolaris''], который был опубликован в апреле 2006, уже два года стукнуло…<br />
<br />
{{note}} Да знаю я. Что-то поменялось, git обновился, но Земля вертится, и ''Mercurial'' тоже улучшился.<br />
<br />
{{question}} Какие особые проблемы встретились вам при миграции?<br />
<br />
{{note}} Права и владения файлами могут быть проблемой при разделении репозитария через сетевые файловые системы, типа NFS или UFS, так что мы в конец концов настроили нормальный сервер для работы с разделяемыми репозитариями, так лучше. Это несложно.<br />
<br />
Еще мы столкнулись с проблемой, что использование триггеров (''hooks'') для отката или фильтрации ''push''-изменений создает некоторое временное окно, в течении которого кто-то может вытащить (''pull'') изменения, которые должны быть откачены. В результате мы завели пару репозитариев — один для публикации изменений (''push''), другой — для извлечения (''pull''), и настроили между ними автоматическую синхронизацию, которая срабатывала после выполнения всех триггеров.<br />
<br />
Использование лесов (''forests'') также приводило к проблемам, т.к. ''forest-push'' по сути набор отдельных push-операций, и если одна из них падает, то по уму надо бы откатить и все остальные. Однако никто этого не делает, все надеются на удачу.<br />
Впрочем, если репозитории в лесе достаточно независимы, это не будет реальной проблемой.<br />
<br />
{{question}} И как оно в повседневном использовании?<br />
<br />
{{note}} Поживем — увидим. Такие изменения кому-то даются легко, кому-то — тяжело. Дайте время, я думаю большинство привыкнет и даже выучится это любить.<br />
<br />
Понятие «рабочих наборов файлов» (''working set files'', с чем работает <tt>hg update</tt>) и необходимость интеграции ''changeset''-ов, которые непонятно с чем сливать, путает народ. Также идея пересылать ''changeset''-ы а не отдельные файлы, для некоторых людей приводит к проблеме «Почему нельзя просто переслать вот этот вот один файл?».<br />
<br />
{{question}} И чем это лучше, чем ''TeamWare''?<br />
<br />
{{note}} Много-много-много быстрее чем TeamWare. В перспективе наши команды в Китае и России перейдут на единую инфраструктуру сборки и интеграции, так как им не потребуется держать зеркала для серверов интеграции. Обновления (''pulls'') очень быстры даже при медленных соединениях.<br />
<br />
Состояние репозитория в Mercurial достаточно целостное, в отличие от ''TeamWare'', который разрешал частичные workspac-ы, да и вообще TeamWare всего лишь дырявая авоська с индивидуально учитываемыми (SCCS-) файлами.<br />
<br />
Понятие набора изменений (''changeset'') в TeamWare отсутствует, вместе с понятием определенного состояния репозитария целиком (т.е. просто ''id''-а, ''changeset''-а).<br />
<br />
{{question}} Так есть что-то, что вам не хватает от ''TeamWare''?<br />
<br />
{{note}} Ребятам не хватает оповещений через email, и еще истории транзакций «putback/bringover», хотя многое из этого можно вытащить из ''changeset''.<br />
Возможно еще не хватает чего-то типа истории транзакций с репозиторием, но опять таки, почтовых архивов событий от Mercurial было бы достаточно.<br />
<br />
{{question}} Так <tt>Hg</tt> стал избранной Sun-ом СУВ для всего, включая внутренние проекты? Или Sun использоует ее только для публичных проектов, которым требуется открытость?<br />
<br />
{{note}} Да мы все проекты переносим, как внутренние, так и внешние, там где это имеет смысл разумеется. Вижу, что растет интерес решившихся на это проектов.<br />
<br />
==== Pierre d'Herbemont ====<br />
<br />
Также мне удалось расспросить на тему <tt>git</tt> и ''Pierre d'Herbemont'' из [http://www.videolan.org/vlc/ VLC].<br />
<br />
{{question}} Для начала, какую систему управления версиями вы использовали до <tt>git</tt>?<br />
<br />
{{note}} SVN, затем зеркало <tt>git-svn</tt>.<br />
<br />
{{question}} А когда вы мигрировали?<br />
<br />
{{note}} Мы открыли git-зеркало для svn-репозитория, чтобы облегчить участие VLC в ''Google Summer of Code''. Это что предшествало этому. Затем мы полностью мигрировали на <tt>git</tt> 1-2го марта 2008.<br />
<br />
{{question}} А почему вы выбрали Git, а не его конкурентов?<br />
<br />
{{note}} По пунктам:<br />
* Лучше SVN: Git быстр. Ветка дешевая. Атомарные коммиты<ref>Удивительная претензия к SVN, в котором это есть (''примечание переводчика'').</ref>. Можно делать ''rebasing'' относительно вершины другого дерева.<br />
* Лучше других DVCS: Проверенная пользовательская база (''Linux Kernel''). Я успешно использовал его, когда работал над ''Wine''. Git sexy. И несколько ключевых разработчиков имело опыт с ''Git'', и никто с Mercurial или чем-то подобным. Вобщем, тут не технические соображения сработали.<br />
<br />
{{question}} Были у вас какие-нибудь специфические проблемы с миграцией? А с ежедневным использованием?<br />
<br />
{{note}} Были проблемы с <tt>Trac</tt> и <tt>buildbot</tt>. У них поддержка Git была минимальной, особенно в их релизных версиях. Нам пришлось вытаскивать последние версии ''Builbot'' из исходников. Для ''Trac'' мы использовали убогий Git-плагин, который требовал <tt>Trac 0.11</tt>. Но <tt>Trac 0.11</tt> еще не стабилен, там есть несколько известных утечек памяти, которые удерживают нас от переключения. В общем, мы ждем, когда они это починят...<br />
<br />
Некоторым контрибьюторам требуется некоторое время, чтобы освоится с Git. Но через пару дней, все оказывается в порядке.<br />
<br />
И многие git-ньюбы начинают действительно им наслаждаться.<br />
<br />
== Ну и что? ==<br />
<br />
Выбор между распределенными и централизованными СУВ далек от простоты.<br />
DVCS определенно изменят практику вашей работы, как индивидуальной, так и командной.<br />
<br />
''Subversion'', один из лидеров CVCS [http://blog.red-bean.com/sussman/?p=79 не сдается]<ref>Мы сделали переводы этих статей, см. [[:Категория:Статьи о Subversion]]</ref> и в производительности, и по функционалу и [http://subversion.tigris.org/roadmap.html версия 1.5] уже должна быть неплохим компромиссом. Он может рассчитывать на существущих пользователей и дух простоты (за счет некоторых неудобств). В определенных случаях, как например в работе с большими бинарными файлами, ''Subversion'' должен быть лучше, чем DVCS т.к. пространство под рабочии копии остается неизменным. Также он эффективней, если вы активно используете частичные ''checkout''-ы, (хотя если это происходит часто — это явная проблема недостаточного разбиения вашего проекта на модули).<br />
<br />
Даже если вы сделаете свой выбор в пользу DVCS или CVCS, то будет сложно сравнить конкурентов в выбранной области, т.е. реализация (например, команды) и соответственно их производительность, будет существенно отличаться. Нет ни одного теста производительности даже для общих операций.<br />
В этой жесткой битве, ''Bazaar'' потерял многих, очень важных и влиятельных ранних пользователей-энтузиастов (Mozilla, Solaris, OpenJDK) из-за плохой начальной производительности. <br />
Еще стоит заметить, что вебсайт Bazaar был слишком «маркетинговым»: публиковались не совсем честные сравнения с конкурентами, или тесты производительности по отдельным параметрам, в которых система превосходила конкурентов (см. например [http://bazaar-vcs.org/Benchmarks/SpaceEfficiency Space efficiency]), при том, что не было сравнений по времени для ежедневных команд: <tt>diff</tt>, <tt>add</tt>, ...<br />
Мне кажется, что хотя все эти три проекта стартовали примерно в одно и то же время, <tt>bzr</tt> с самого начала столкнулся с множеством проблем в производительности и архитектуре, что привело к тому, что он сейчас чуть менее зрел и надежен, чем его конкуренты.<br />
<br />
И еще ранее не наблюдавшийся феномен — похоже, что многие делают выбор в зависимости от языка программирования сообщества:<br />
* Java и разработка связанная с Sun более интересуется <tt>Mercurial</tt><br />
* C/Linux/Ruby/Rails -проекты сооблазняются <tt>git</tt>.<br />
<br />
Надеюсь, эта статья вас просветила, и я всегда рад узнать о вашем опыте и иным отзывам!<br />
<br />
=== Благодарности ===<br />
Благодарю тех, кто любезно согласился на мое интервью: ''Kelly O'Hair'', ''Pierre d'Herbemont''.<br />
''Ian Clatworthy'' за его оперативную помощь в преобразовании hg-репозитория Mozilla в <tt>Bzr</tt>.<br />
<br />
IRC-каналы #git, #mercurial, #bzr на Freenode IRC, #mozilla на Mozilla IRC.<br />
Картинка с бегунами от [http://flickr.com/photos/antoniojuez/384183109/ Antonio Juez].<br />
<br />
=== Случайные цитаты === <br />
;Linus Torvald:<br />
:* «Subversion has been the most pointless project ever started». <br />
:* «If you like using CVS, you should be in some kind of mental institution or somewhere else»<ref>См. наш перевод этой речи Линуса Торвальдса — [[Линус Торвальдс о GIT на Google Talks]]</ref>.<br />
<br />
;Mark Shuttleworth (Ubuntu / Canonical Ltd.): <br />
:* «Merging is the key to software developer collaboration».<br />
<br />
;Ian Clatworthy (Canonical / Bazaar): <br />
* «By 2011-2012, I predict this technology will be widely adopted and many teams will wonder how they once managed without it.»<br />
<br />
;Assaf Arkin в [http://blog.labnotes.org/2008/04/30/git-forking-for-fun-and-profit/ 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.»<br />
<br />
Статья была обновлена 2008-05-12 после коммантариев от [http://article.gmane.org/gmane.comp.version-control.bazaar-ng.general/41384 Ian Clatworthy] и портала [http://reddit.com/r/programming/info/6iiny/comments/ reedit].<br />
* Добавлены плагины Bzr и Windows GUI: <tt>rebase</tt>, ..., <tt>Wildcat BZR</tt>, ...<br />
* Добавлен <tt>Hg Shelve</tt>.<br />
* Обновлены SLOC для Hg (надо было еще учесть HTML-документацию, и оставил <tt>contrib</tt>, отвественный за поддержку Lisp и Tcl/Tk).<br />
* Обновлен размер репозитория для <tt>git</tt> после правильной команды <tt>repack</tt> (<code>git repack -a -f -d --window=100 --depth=100</code> после которой размер стал постоянным) (Спасибо за комментарий ''dhamma vicaya'').<br />
<br />
=== Извинения ===<br />
[http://darcs.net/ darcs], [http://monotone.ca/ Monotone]! Простите, что не рассматривал вас в этом сравнении, т.к. мне и так пришлось неслабо поработать чтобы собрать всю эту информацию и протестировать эти три DVCS. Да, странно получилось, что хотя вы самые старые на DVCS-сцене, актуальны теперь в основном те DVCS, которых я рассматривал тут (конечно, вряд ли эта ситуация измениться, но добро пожаловать пользователям <tt>darcs</tt> и <tt>Monotone</tt> с комментариями и рекламой!).<br />
<br />
==Ссылки==<br />
<br />
* Очень исчерпывающие [http://en.wikipedia.org/wiki/Git_%28software%29 Wikipedia page about Git].<br />
[http://en.wikipedia.org/wiki/Revision_control#Distributed_revision_control Distributed Revision Control Wikipedia page].<br />
[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software Wikipedia page].<br />
<br />
* [http://ianclatworthy.files.wordpress.com/2007/10/dvcs-why-and-how3.pdf Distributed Version Control - Why and How ] от Ian Clatworthy, ''Canonical'' (Bazaar).<br />
<br />
* [http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/ Intro to Distributed Version Control (Illustrated)].<br />
<br />
* [http://www.dribin.org/dave/blog/archives/2007/12/28/dvcs/ Distributed Version Control Systems] от ''Dave Dribin'', который в конце концов выбрал [http://www.dribin.org/dave/blog/archives/2007/12/30/why_mercurial/ выбрал Mercurial].<br />
<br />
* [http://wincent.com/a/about/wincent/weblog/archives/2007/10/why_distributed.php Why Distributed Version Control].<br />
<br />
* [http://www.opensolaris.org/os/community/tools/scm/ Source Code Management for OpenSolaris]. [http://www.opensolaris.org/os/community/tools/scm/history/ OpenSolaris SCM Project History] (2005).<br />
<br />
* [http://blogs.sun.com/kto/entry/mercurial_openjdk_questions Mercurial OpenJDK Questions] от ''Kelly O'Hair'', ''Sun''.<br />
* [http://plasmasturm.org/log/487/ Why I chose git].<br />
* [http://live.gnome.org/DistributedSCM Distributed SCM] от команды Gnome.<br />
* [http://wiki.freebsd.org/VersionControl FreeBSD SCM Requirements].<br />
* [http://wiki.services.openoffice.org/wiki/SCM_Requirements Open Office Requirements].<br />
* [http://wiki.mozilla.org/Version_Control_System_Requirements Mozilla VCS Requirements].<br />
* [http://texagon.blogspot.com/2008/02/use-mercurial-you-git.html Use Mercurial you git!] от ''Ian Dees''.<br />
* [http://www.dehora.net/journal/2008/04/06/what-a-dvcs-gets-you-maybe/ What a DVCS gets you (maybe)] от ''Bill de hÓra''.<br />
* [http://www.rockstarprogrammer.org/post/2008/apr/06/differences-between-mercurial-and-git/ The Differences Between Mercurial and Git].<br />
<br />
Ну и все URLы, так или иначе упомянутые в этой статье.<br />
<br />
===Шпаргалки===<br />
<br />
* [http://ktown.kde.org/%7Ezrusin/git/git-cheat-sheet-medium.png Git Cheat Sheet]<br />
* [http://mercurial.selenic.com/wiki/QuickReferenceCardsAndCheatSheets Mercurial Cheat Sheets]<br />
* [http://doc.bazaar-vcs.org/bzr.1.3/en/quick-reference/quick-start-summary.pdf Bazaar Quick Start Card]<br />
<br />
===Условия тестов===<br />
''Benchmark conditions''<br />
<br />
Тесты были проведены с использованием:<br />
* <tt>AMD Athlon(tm) 64 Processor 3500+</tt><br />
* <tt>1GB RAM</tt><br />
* <tt>Linux Kubuntu 6.10 Edgy x86_64 with ext3 fs</tt>.<br />
<br />
Каждую команду запускали <tt>8</tt> раз, с отбрасыванием лучшего и худшего времени. Все это выполнялось локально, через файловую систему (надо конечно протестировать и остальные протоколы, ведь даже если DVCS не связана с центральным сервером, плохо реализованное сетевое взаимодействие существенно ухуджит и производительность пользователей.<br />
<br />
Использовались следующие версии:<br />
<br />
* [http://www.selenic.com/pipermail/mercurial/2008-March/018014.html Mercurial 1.0 released] от <tt>2008-03-24</tt> (c [http://www.selenic.com/mercurial/bts/issue1050 Issue 1050 patch] опцией «Edgy inotify»)<br />
* [http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.5.txt Git 1.5.5] от 2008-04-08<br />
* [http://doc.bazaar-vcs.org/bzr.1.2/en/release-notes/NEWS.html Bazaar 1.3.1] от 2008-04-10<br />
<br />
Репозиторий содержал слепок из 12456 ''changeset''-ов (от 20080303, 70853 полных версий из hg-репозитория), ≈30000 файлов из репозитория Mozilla (изначально они были в hg-формате и сконвертированы в git-репозиторий с помощью <tt>hg-fast-export.sh</tt>, и <br />
в Bazaar-репозиторий с помощью <tt>hg-fast-export.sh</tt> плюс плагин <tt>fast-import</tt>).<br />
Для репозиториев использовались файловые форматы по умолчанию, и размер репозитория <tt>git</tt> оставался постоянными, при запуске <tt>git-gc</tt> (что в общем, считается нормальным для свежемигрировавшего репозитория). Правился один файл (<code>dom/src/base/nsDOMClassInfo.cpp</code>), точно как в [http://weblogs.mozillazine.org/jst/archives/2006/11/vcs_performance.html тесте проводимом ''Jst'' полтора года назад].<br />
<br />
== Примечания ==<br />
<references/><br />
<br />
<br />
{{replicate-from-custiswiki-to-lib}}<br />
[[Категория: Системы контроля версий]]</div>Bogolt