phdru.name / Russian / Software / VersionControl

svn.html

Достоинства Subversion (особенно по сравнению с CVS).

CVS оперирует одним файлом за раз. В результате CVS не запоминает версий директорий, не умеет хранить версии переименований и удалений файлов, не имеет транзакций.

Subversion (http://subversion.tigris.org/) оперирует деревьями файлов и директорий. В результате SVN хранит версии для директорий, умеет манипулировать (переименовывать и удалять) директориями и файлами, имеет транзакции (changeset либо попадает в репозиторий целиком, либо целиком откатывается). Более того, если удалить файл, а на его месте создать новый файл с таким же именем - Subversion запомнит, что это 2 разных файла, и будет хранить для них историю изменений отдельно.

Основу Subversion составляет массив деревьев, каждое дерево является ревизией, и представляет собой полную копию проекта - полное дерево. Дерево это, однако, хранится очень эффективно - неизменённые файлы в дереве просто представляют собой ссылки на предыдущее дерево. Номера ревизий - это просто индексы в этом массиве.

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

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

Для создания бранча или тега дерево просто копируется упомянутой выше мгновенной операцией копирования.

А в CVS поставить тег (в т.ч. и бранчевый) на большое дерево - это длительная операция, и молитесь, чтобы во время неё связь с сервером не прервалась, и ни клиент, ни сервер не упали.

В CVS работать с бранчами неудобно. Я знаю проекты, в которых бранчи не используется именно по причине этого неудобства. В других проектах команда cvs update -j создаёт множество конфликтов, которые постоянно приходится решать. Самый простой пример:

__revision__ = "$Id: stop,v 1.1.2.1 2004/11/03 11:04:14 phd Exp $"

__date__ = "$Date: 2004/11/03 11:04:14 $"[7:-2]

В соседней ветви и дата, и ревизия будут другие, и при переливании патча из ветки в ветку произойдёт конфликт. Во всех файлах. Если части патчей в нескольки ветках пересекаются, то их слияние обязательно породит конфликт. Или, скажем, вы перенесли часть патча руками, а часть переносите командой cvs update -j. Конфликт гарантирован.

Subversion в процессе обновления игнорирует ключевые слова, и конфликта не возникает. Если код, который должен оказаться в файле, уже там есть (в результате переноса руками или из какой-то третьей ревизии) - SVN его игнорирует, и конфликта не возникает. Большое облегчение для работы с ветвями проекта.

В рабочей копии хранятся также неизменённые копии файлов (после последнего коммита). Это позволяет делать svn status/diff, не обращаясь к сети. Трафик стоит дороже места на диске. Кроме того, командой svn revert можно изменённые файлы восстановить (отменив изменения), опят таки не обращаясь к сети.

В Subversion есть swig'овские (и не только) привязки (bindings) к нескольки языкам программирования - Python, Java, Perl. Можно вызывать функции SVN прямо из программ, не обращаясь к утилитам командной строки.

Для переноса существующего репозитория CVS есть программа http://cvs2svn.tigris.org/. Она может переносить репозитории целиком, или выбирать из них определённые ветки и ревизии.

Для просмотра репозиториев можно использовать web-инструменты http://viewcvs.sourceforge.net/ (начиная с версии 1.0), http://viewsvn.berlios.de/, http://websvn.tigris.org/.


Эта страница http://phdru.name/Russian/Software/VersionControl/svn.html была сгенерирована 08.06.2014 в 20:51:47 из шаблона CheetahTemplate svn.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.