SVN Mini HowTo

From AstroNuWiki
Jump to: navigation, search

SVN или SubVersion - пакет для удобной работы с проектом группой людей (разработчиков). Под проектом подразумевается какой-либо продукт: C++ программа, Tex-документ, HTML-страничка, и т.п.

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

Основные команды

Итак, основные команды:

1. создание папки проекта (репозитория) на удаленной машине
(remote.computer)
    # svnadmin create /path/to/project
  - изменяем информацию о группе проекта (если необходимо)
    # chown -R :group /path/to/project
  - позволяем данной группе писать в созданный репозиторий
    # chmod -R g+w /path/to/project
  - и ещё небольшой флаг
    # chmod g+s /path/to/project/db
2. загрузка начальной версии проекта из его директории
- на удаленной машине (т.е. начальная версия и проект на одной машине)
# cd /path_to_the_local_project
# svn import . file:///path/to/project -m "First Import"
- с вашего локального компьютера (начальная версия и проект на разных машинах)
заходим на машину с начальной версией (локальная)
# cd /path_to_the_local_project
# svn import . svn+ssh://remote.computer/path/to/project -m "First Import"
3. если Вы хотите сделать рассылку, в которой будет отображаться информация о коммитах:
   # cd remote.computer/path/to/project
   # cp post-commit.tmpl post-commit
   # chmod 755 post-commit
   файл должен содержать следующие строки:
   REPOS="$1"
   REV="$2" 
   /usr/lib/subversion/hook-scripts/commit-email.pl "$REPOS" "$REV" -s "SVN update: project" mail1 mail2 mail3
4. получение начальной версии на свой компьютер (создание локальной версии) 
в текущую директорию
# svn checkout svn+ssh://remote.computer/path/to/project
5. список команд для работы с локальной версией
- обновить до текущей рабочей версии
# svn update (/path/to/file)
- добавить новый файл (папку)
# svn add /path/to/file
- удалить файл
# svn delete /path/to/file
- сравнить локальную версию с текущей в проекте
# svn diff (/path/to/file)
- сравнить внесенные вами изменения
# svn status (/path/to/file)
- загрузить вашу версию в репозиторий
# svn commit (/path/to/file)
- Убрать все Ваши локальные изменения
# svn revert (/path/to/file)
Для комманд, в описании которых имя файла написано в скобках, по умолчанию
действие делается для всех файлов, если никакой конкретный файл не указан.
Вы можете также указать список файлов через пробел.

Как таггировать версии?

Зачастую нам хочется дать некий номер текущей (или другой) версии, дать возможность ей пользоваться другим пользователям и всегда знать о чем они нам толкуют говоря о багах в версиях X.Y.Z. Как же сделать такой таг? Это делается при помощи команды

svn copy

Вот пример. Пусть текущая версия хранится в папке svn+ssh://remote.computer/path/to/project/trunk, а таггированные версии мы хотим хранить в svn+ssh://remote.computer/path/to/project/tags как X.Y.Z например:

svn+ssh://remote.computer/path/to/project/tags/1.0.0
svn+ssh://remote.computer/path/to/project/tags/1.0.1
...
svn+ssh://remote.computer/path/to/project/tags/1.1.0

И мы хотим сделать релиз новой версии 1.1.1

- Для этого сначала мы создаем директорию 1.1.1 прямо на сервере командой
# svn mkdir svn+ssh://remote.computer/path/to/project/tags/1.1.1
- Теперь копируем текущую версию как таг 1.1.1
# svn copy svn+ssh://remote.computer/path/to/project/trunk svn+ssh://remote.computer/path/to/project/tags/1.1.1
- Заметим, что эта операция выполняется почти мгновенно, поскольку реально ничто не копируется, а только создается линк внутри репозитория. Но для нас это будет выглядеть как таг. Например, пользователь, может взять эту версию так:
# svn co svn+ssh://remote.computer/path/to/project/tags/1.1.1


Миграция репозитория из одного места в другое

1. на исходном сервере делаем дамп:

   svnadmin dump REPOS_PATH_1 > svn.dump

2. копируем дамп на новый сервер и создаем чистый репозиторий:

   svnadmin create REPOS_PATH_2

3. восстанавливаем из дампа:

   svnadmin load REPOS_PATH_2 < svn.dump

4. если при таком переносе изменился URL репозитория, то для всех рабочих копий необходимо сделать:

   svn switch --relocate FROM TO


Полное описание смотрите здесь svn-book.pdf

User:OlegSamoylov 13:09, 22 November 2007 (MSK)