#encoding koi8-r #extends phd_site #implements respond #attr $Title = 'svn.html' #attr $Copyright = 2004 ## #def body_text Достоинства 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/. #end def $phd_site.respond(self)