6/09/2008

Subversion - быстрый старт, или Ставим Subversion/SVN за минуту в Linux

Вы пишете программу на любом языке программирования или просто новую статью в латехе. В порыве вдохновения лихо правите текст, забывая о бекапах между изменениями. И тут вспомнаете, что часть текста вчера удалили зря. Резервных копий нет, а текст был хорош... И тут время ставить систему контроля версий - например, Subversion. О том, как поставить и настроить Subversion в Linux, написан этот пост.


Какая польза от Subversion не-программисту?
Даже если вы не профессиональный программист, система контроля версий может быть полезна для:
  1. возможности откатиться на любую предыдущую версию документа. Если вы пишете статью в ЛаТеХе и вам захотелось посмотреть на то, что у вас было две недели назад. В этом случае можно получить как историю изменений, так и непосредственно сами версии текстов.
  2. коллективной работы. Если статью или программу пишут несколько человек и хранят изменения в одном файле под управлением SVN, то они могут одновременно изменять и удалять разные части без риска потерять изменения.
  3. создания нескольких веток документа. Внесённые удачные изменения в одну ветку можно объединить с результатом основной работы.


Как быстро поставить и использовать систему контроля версий?
На самом деле, в этом нет ничего сложного. Итак, возьмите вашу латеховскую статью \ скрипт \ исходник программы и попробуйте. Для того, чтобы быстро поставить Subversion (она же SVN) и воспользоваться всеми её благами, нужно выполнить несколько простых шагов.


1. Ставим Subversion и оболочку для неё
Хотя с системой контроля версий удобнее работать через консоль, графическая оболочка не помешает (можно визуально наблюдать изменения, сравнивать правки и прочее). Ставим:
# aptitude install kdesvn svn
и все зависимости (здесь рассматривается svn v.1.4.2 из Debian GNU/Linux Etch). Через мгновение у нас уже будет установлена Subversion. Полдела сделано!


2. Начало работы с Subversion - импорт файлов в репозиторий
Первым делом нужно создать новый репозиторий - простой, без особых затей и канделябров:
$ svnadmin create phdthesis
В текущем каталоге появится подкаталог phdthesis следующего содержания:
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 conf
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 dav
drwxr-xr-x 5 penta4 penta4 32768 2008-06-03 18:55 db
-r--r--r-- 1 penta4 penta4 2 2008-06-03 15:48 format
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 hooks
drwxr-xr-x 2 penta4 penta4 32768 2008-06-03 15:48 locks
-rw-r--r-- 1 penta4 penta4 229 2008-06-03 15:48 README.txt

Красным подсвечены важные для нас каталоги: conf содержит конфигурационный файл репозитория (сейчас мы его немного допилим), а db содержит версии наших данных.

Наш репозиторий предполагается локальным, то есть доступа по сети к репозиторию нет и не надо. Тогда нужно конфиг немного допилить. Редактируем файл phdthesis/conf/svnserve.conf для того, чтобы у нас не было проблем с записью туда новых файлов - для этого ищем строку anon-access и правим:
anon-access = write
Теперь любой аноним имеет права на запись в наш репозиторий - то есть вам не нужно ломать себе голову авторизацией и паролями (если, конечно, с проектом работаете вы один).

Так, репозиторий создали, теперь его нужно наполнить данными. Для этого переходим в каталог, где хранятся нужные данные, и даём команду:
$ svn import -m "Initial dissertation state" file:///mnt/flash/other/phdthesis/
Здесь указывается полный путь до репозитория. Каждый раз указывать его не нужно - скоро мы поднимем SVN-сервер одной левой, и наша жизнь станет ещё веселее.

При импорте файлов Subversion будет выводить в консоль имена добавляемых файлов:
Adding disser.ins
Adding chapter.dtx
Adding kvoptions.ins
Adding (bin) draft_PhD_Konnik.dvi
Adding PhD_Konnik_chapter_introduction.tex
Adding PhD_Konnik_chapter_introduction.tex.backup
Adding PhD_Konnik.log
Adding PhD_Konnik.toc
Adding (bin) PhD_Konnik_chapter_introduction.dvi
Adding PhD_Konnik.tex
Adding (bin) PhD_Konnik.pdf
Adding (bin) PhD_Konnik.dvi

Committed revision 1.
То есть команда svn import берёт содержимое текущего каталога и помещает его в репозитарий, а так же все вложенные каталоги, если они есть. При этом выводится номер ревизии - это 1, наша первая правка.

Теперь ваши данные увековечены в репозитории, который будет автоматически бдить за вашими данными. И это просто!


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

$ svn checkout file:///mnt/flash/other/phdthesis/
в результате чего в текущем каталоге получим локальную копию данных из репозитория.

После внесения нужных правок, загружаем результаты обратно в репозиторий, для чего выполняем команду в каталоге, где находится рабочая копия данных, с которыми работали:
$ svn commit --message "minor edition in tex-files"
После ключа --message пишем в кавычках короткое сообщение, чтобы отличать одну правку от другой. В процессе загрузки изменений Subversion будет выводить имена файлов, которые загружаются:
Sending PhD_Konnik.tex
Sending draft_PhD_Konnik.tex
Transmitting file data ..
Committed revision 2

Готово! Ревизия изменённых файлов зарегистрирована в репозитории. Вот так легко и просто начать работать с Subversion.

Для начала работы с системами контроля версий этого должно хватить.


Ссылки

Очень толковая статья для начала есть тут, фундаментальный талмуд по возможностям Subversion лежит здесь.

33 комментария:

  1. Добавлю ещё, что система контроля версий крайне полезна, если нужно работать над документами на разных машинах (дома, на работе, на ноутбуке). Subversion прекрасно работает через ssh, даже не нужно svnserve запускать. Достаточно просто имя репозитория представить в виде svn+ssh://хост/путь_на_хосте_к репозиторию. Не стоит помещать в репозиторий производные файлы типа dvi. Лишний траффик и пользы никакой.

    ОтветитьУдалить
  2. subversion еще иногда используют для деплоймента, но сам правда не пробовал

    ОтветитьУдалить
  3. Интересной альтернативой являются распределённые системы контроля версий. Я в своё время отказался от Subversion, перейдя на Mercurial.

    ОтветитьУдалить
  4. В простейшем случае (1 человек, 1 компьютер) можно использовать продвинутую систему резервных копий, типа backupfs. Дональд Кнут так делает.

    ОтветитьУдалить
  5. 2 Blogger Michael пишет...
    система контроля версий крайне полезна, если нужно работать над документами на разных машинах
    Именно это и происходит, поэтому очень удобно иметь с собой на флешке репозиторий, из которого получаешь всё.

    Не стоит помещать в репозиторий производные файлы типа dvi.
    Разумеется. Просто я в примере не удалил их :-)

    2 Lazin пишет...
    subversion еще иногда используют для деплоймента
    Для чего-чего? :-)

    2 Константин пишет...
    Интересной альтернативой являются распределённые системы контроля версий.
    Константин, мне не ясны преимущества распределённых систем в случае личного использования. Приведёте пару примеров - буду рад.

    2 ringill пишет...
    В простейшем случае (1 человек, 1 компьютер) можно использовать продвинутую систему резервных копий, типа backupfs.
    Интересная мысль. Попробую. Большое спасибо.

    ОтветитьУдалить
  6. а еще можно прицепить модуль к апачу dav_svn называется кажись. Это вместо svnserve. Доступ к репозиторию происходит в таком случае по хттп протоколу. Довольно удобно, на мой взгляд.

    ОтветитьУдалить
  7. Чтото не заработало

    pwd
    /root/exp

    svn import -m "My project" file:///root/exp/

    svn: Unable to open an ra_local session to URL
    svn: Unable to open repository 'file:///root/exp

    ОтветитьУдалить
  8. 2 Yuriy Volkov пишет...
    а еще можно прицепить модуль к апачу dav_svn называется кажись.
    Юрий, для этого апача надо поставить, а выкатывать авианосец, чтобы порыбачить как-то не продутивно. То есть можно, но легче обойтись шлюпкой :-)

    Это вместо svnserve.
    Да, это удобно, сомнений нет. Но для проекта, где хотя бы человек 5-6. Хотя да, можно будет попробовать.


    2 Анонимный пишет...
    Чтото не заработало
    Похоже, вы просто забыли создать репозиторий. :-)

    ОтветитьУдалить
  9. Мои личные впечатления от использования распределённых VCS:

    1. Общие соображения:
    - рабочая копия является репозиторием, поэтому ещё одна рабочая копия это уже backup. Это не отменяет администрирование, но упрощает его. Если жива хоть одна рабочая копия, то репозиторий жив.
    - можно делать commit, view history даже если нет сети/флешки с репозиторием
    - нет отдельной сущности, репозиторий, что приятно для использования 1 человек + 1 компьютер, так как экономит место. Размер рабочей копии mercurail (=репозиторий) примерно равен размеру рабочей копии subversion.

    2. Особенности реализации (svn vs. mercurial):
    - cубъективно mercurial пошустрей
    - мелочь, но знаю, что кому-то это важно: mercurial создаёт подкаталог .hg только в корне, subversion создаёт подкаталог .svn в каждом подкаталоге

    P.S. Так же как и для subversion, есть бесплатные хостинги для mercirual. История подобная subversion.ru, где людей конкретно кинули, невозможна из-за распределённости

    ОтветитьУдалить
  10. Именно это и происходит, поэтому очень удобно иметь с собой на флешке репозиторий, из которого получаешь всё.

    Не, это не то. Кайф svn как раз в том, чтобы с собой никаких флешек не таскать. Передачей данных машина должна заниматься, а не человек.

    ОтветитьУдалить
  11. Я думаю не надо парить мозги в конфигурации один пользователь - один комп. Здесь достаточно RCS.

    ОтветитьУдалить
  12. Товарищ, почему всё ещё живём в прошлом веке? Распределённые системы контроля версий (Git, Mercurial, Bazaar) имеет тот же функционал, что есть в Subversion, но плюс гораздо больше.

    Да и если нужно VCS для одного человека, но распределённые системы контроля версий тут просто вне конкуренции — из-за очень простой настройки.

    ОтветитьУдалить
  13. Хм, но ведь можно не запускать сервер вообще для такого сетапа. Т.е. вот эта строчка "svnserve -d --root=file:///mnt/flash/other/phdthesis/" не нужна. По сути она вообще ничего не делает, а только вешает в память процесс, который не используется...

    ОтветитьУдалить
  14. 2 Константин пишет...
    рабочая копия является репозиторием, поэтому ещё одна рабочая копия это уже backup.
    Вот именно оно и привлекает :-)

    нет отдельной сущности, репозиторий, что приятно для использования 1 человек + 1 компьютер, так как экономит место.
    Конечно. Например, на работе я могу получать и работать с кодом с любой машины.

    Размер рабочей копии mercurail (=репозиторий) примерно равен размеру рабочей копии subversion.
    У меня не такие большие программы и документы, чтобы это имело значение. У многих, думаю, тоже. Не все же kernel-commiters :-)

    История подобная subversion.ru, где людей конкретно кинули
    А что за история?

    Michael пишет...
    Кайф svn как раз в том, чтобы с собой никаких флешек не таскать.
    Хранить в сети можно, но мне не очень хочется связываться с этим. Мало ли - хостинг накроется...


    2 A.I. пишет...
    Товарищ, почему всё ещё живём в прошлом веке?
    Ибо работает и каши не просит. Колесо изобрели знаете когда? :-)

    Распределённые системы контроля версий (Git, Mercurial, Bazaar) имеет тот же функционал, что есть в Subversion, но плюс гораздо больше.
    А если этот самый дополнительный функционал просто не нужен?

    ОтветитьУдалить
  15. История подобная subversion.ru, где людей конкретно кинули

    А что за история?

    Мне тоже интересно.

    ОтветитьУдалить
  16. Когда-то когда переполз с CVS на SVN — очень нравился, и до сих пор пользуюсь. Хорошая, удобная система контроля версий. Без заумностей. В googlecode и много где ещё опять же она…

    Однако последние полгода почти все новые работы, которые начинаю, делаю в Mercurial (hg). Почему? А вот как-то быстрее и удобнее. Не нужно задумываться о том, чтобы даже локальный репозиторий завести. Удобно синхронизироватсья. Создал каталог для небольшой работы, сразу сказал hg init, и вперёд. Приходит время — можно сделать clone и поместить в сети.

    В общем, мне нравится. Именно из-за того, что можно быстро «включить» систему контрля версий для любого, самого маломальского дела, очень быстро. И при этом не нужно тщательно продумывать структуру центрального репозитория. А по-сравнению с git hg мне нравится больше, потому что как-то яснее и понятнее, меньше сущностей.

    К слову сказать, если уж упомянули систему контроля версий — хорошо бы дать ссылку на assembla.com, дают платный и бесплатный хостинг как для SVN, так и для Hg. В том числе, можно и для непубличных проектов использовать.

    ОтветитьУдалить
  17. > 2 virens, Сергей Третьяк ...
    А что за история?
    В какой-то момент сделались платными. Что самое плохое, требовали деньги за дампы уже имеющихся там репозиториев

    Цитата с форума: Дампы репозиториев тоже не удалось утянуть: "Предоставление дампа платное, его стоимость — 20$ за login."

    ОтветитьУдалить
  18. На ассембле hg дают? Не нашёл. А сервис прикольный. Пользуем его.

    2 Константин: Молодцы ребята, ничего не скажешь. ;)

    ОтветитьУдалить
  19. > ...вам захотелось посмотреть на то, что у вас было две недели назад. В этом случае можно получить как историю изменений, так и непосредственно сами версии текстов...

    можно чуть подробнее о том, какие действия нужны, чтобы увидеть текст, который был 15 коммитов назад, не теряя "текущей" версии?

    ОтветитьУдалить
  20. Я в итоге с svn перешел на git. Для работы в одиночку главное его преимущество - более простое создание репозитория (просто git init; git add .; git commit в директории, где лежат исходники или что у вас там).

    ОтветитьУдалить
  21. Если большая книжка в LaTeX'e и много в ней рисунков разных (растровых да ещё многовясящих), и если их перерисовывать периодически, то трафик может сильно увеличиться или место может на флешке кончиться.
    У меня такое бывает, когда макеты трудов конференции или Вестника делаю.
    Поэтому наряду с SVN использую Unison - программу для синхронизации. Теховские файлы в репозиториях, каталог с рисунками и разные архивы (исходные вордовые файли и прочее) unison'ом на флешку синхронизирую.
    Backup unison'ом делать не рекомендую.
    Хотел про эти дела тоже написать статью, да вот времени всё нет. Думаю, что коммент тоже пригодиться.

    ОтветитьУдалить
  22. 2Сергей Третьяк:
    Free Mercurial Hosting (на Ассембла)

    ОтветитьУдалить
  23. 2аноним:
    > можно чуть подробнее о том, какие действия нужны, чтобы увидеть текст, который был 15 коммитов назад, не теряя "текущей" версии?

    1) hg serve
    2) http://localhost:8000/file/-16/filename

    можно и http://localhost:8000/file/-16/filename?style=gitweb

    угадал?

    ОтветитьУдалить
  24. http://doc.bazaar-vcs.org/bzr.dev/en/mini-tutorial/index.html
    http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html

    Вот здесь почитайте про Bzr. Подозреваю, что вы найдете ответ на 80% вопросов о целесообразности использования и преймуществах.

    ОтветитьУдалить
  25. А я использую svn, в основном для того чтобы не забыть что распечатать надо перед университетом.
    У меня есть папочка такая: to_print.
    Я в нее svn'ом синхронизирую файлы на флэшку, даже скрипт специальный сделал, чтобы меньше телодвижений делать.
    Очень удобно.

    /в курсе что это забивание гвоздей микроскопом, но что уж поделать, уж больно удобный для этого микроскоп придумали...

    ОтветитьУдалить
  26. Спасибо за статью!
    Очень хороша система для программирования одной системы несколькими программистами. В нашей компании именно так и работают

    ОтветитьУдалить
  27. ># aptitude install kdesvn svn

    На всякий случай: в Debian lenny пакета svn нету, есть subversion.

    ОтветитьУдалить
  28. Если кому нужен бесплатный хостинг subversion, для небольших проектов, то посмотрите на этот сайт - MySvn

    ОтветитьУдалить
  29. А я привык в свое время к CVS, теперь нет хорошей мотивации переходить на SVN...

    ОтветитьУдалить
  30. у меня вот сильное убеждение, что особенно для личного пользования гораздо проще и удобнее darcs система...

    ОтветитьУдалить
  31. Большое "благодарю" автору - за статью.
    Ещё большая благодарность комментаторам, за высказанные мнения.

    Давно пора заводить себе нечто вроде svn, но всё как-то лень.

    ОтветитьУдалить