# Поверхностный обзор работы с системой

Это попытка показать работу с системой Subversion на практических примерах. Демонстрируемые команды - только лишь маленькая часть того, что может Subversion. Для получения полной информации см. главу 3 книги "Управление версиями с помощью Subversion" - в ней приведено исчерпывающее описание для каждой команды.

## Создание репозитория

В клиентском приложении Subversion реализован абстрактный интерфейс для доступа к репозиторию. В настоящее время в виде библиотек доступны три реализации Доступа к репозиторию ("Repository Access", RA). Вы можете проверить, какие методы доступа доступны в Вашем клиентском приложении, например так:

    $ svn --version
    svn, version 0.29.0 (r6976)
       compiled Sep  6 2003, 19:19:59

    Copyright (C) 2000-2003 CollabNet.
    Subversion is open source software, see @uref{http://subversion.tigris.org/}

    The following repository access (RA) modules are available:

    * ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
      - handles 'http' schema
      - handles 'https' schema
    * ra_local : Module for accessing a repository on local disk.
      - handles 'file' schema
    * ra_svn : Module for accessing a repository using the svn network protocol.
      - handles 'svn' schema

Если Вы не видите записи "ra_local" - скорее всего это означает, что библиотека Berkeley DB не была доступна при компиляции клиентского приложения. Для выполнения конкретных примеров, приведённых ниже, Вам необходимо клиентское приложение с поддержкой ra_local.

Создадим пустой репозиторий, используя приложение `svnadmin` :

    $ svnadmin create myrepos

Предположим, что у Вас есть директория `someproject`, которая содержит файлы, которые Вы хотите поместить под управление системы контроля версий:

    someproject/foo
                bar
                baz/
                baz/gloo
                baz/bloo

У Вас есть репозиторий, и вы можете осуществить первоначальный импорт данных в него (file в начале URL означает локальный доступ):

    $ svn import file:///абсолютный/путь/к/репозиторию someproject myproj
    …
    Committed revision 1.

В приведённом примере выполняется следующее: в корне файловой системы репозитория создаётся новая директория `myproj` и в неё копируется содержимое директории `someproject`. Теперь Ваши данные находятся в репозитории и можно начинать работу с ними.

### Создание рабочих копий

Создадим рабочую копию Вашего проекта. Для этого укажем точный URL директории репозитория, копию которой мы хотим получить. Параметр после URL означает имя директории рабочей копии.

    $ svn co file:///usr/local/svn/repos/myproj wc
    A  wc/foo
    A  wc/bar
    A  wc/baz
    A  wc/baz/gloo
    A  wc/baz/bloo

Теперь директория `wc` содержит рабочую копию, связанную с положением `/myproj` в репозитории (В предположении, что репозиторий находится по абсолютному пути file:///usr/local/svn/repos).

Создадим дубликат рабочей копии:

    $ cp -R wc wc2

И произведём некоторые изменения в нашей первой рабочей копии:

    $ cd wc
    $ echo "Новый текст" >> bar  # Изменяем содержимое файла bar
    $ svn propset color green foo      # Добавляем метаданные к файлу foo
    $ svn rm baz                       # Помечаем директорию baz для удаления
    $ touch newfile
    $ svn add newfile                  # Помечаем новый файл для добавления в репозиторий

Довольно много изменений. Если отлучиться и вернуться к работе на следующий день, будем ли мы помнить, какие изменения произвели вчера? Хороший вопрос... Однако, проблема решается легко. Команда `status` покажет нам все локальные изменения в нашеё рабочей копии:

    $ svn status                   # Посмотреть изменения в рабочей копии
    M   ./bar
    _M  ./foo
    A   ./newfile
    D   ./baz
    D   ./baz/gloo
    D   ./baz/bloo

Что мы видим? Три файла помечены для удаления ("Deleted", D) из репозитория, один файл помечен для добавления ("Added", A) в репозиторий и содержимое двух файлов было каким-то образом изменено ("Modified", M). Подробности про команду `svn status` - в главе 3 книги "Управление версиями с помощью Subversion".

"Зафиксируем" изменения, сделанные в рабочей копии, в репозиторий (текущая редакция которого станет равной 2):

    $ svn commit -m "Исправлена ошибка #233"
    Sending    bar
    Sending    foo
    Adding     newfile
    Deleting   baz
    Transmitting data...
    Committed revision 2.

Параметр -m служит для указания комментария к новой редакции. Это просто описание набора изменений, которые Вы фиксируете в репозиторий. В дальнейшем любой другой пользователь репозитория может прочитать Ваши комментарии и быть в курсе того, какие изменения Вы внесли в редакции 2.

Теперь представьте, что Вы - это другой человек из вашей команды. Для этого просто перейдите ко второй рабочей копии (`wc2`). Чтобы получить из репозитория изменения, сделанные во второй редакции, нужно выполнить команду `svn update`:

    $ cd ../wc2                # Перейдём ко второй рабочей копии

    $ svn update               # Получим изменения из репозитория
    U   ./bar
    _U  ./foo
    A   ./newfile
    D   ./baz

Результат работы команды `svn update` говорит о том, что файл baz удалён из Вашей рабочей копии, новый файл newfile добавлен к рабочей копии, а содержимое файлов bar и foo обновлено из репозитория.

Если файл `bar` содержит локальные изменения, произведённые во второй рабочей копии, будет произведена операция слияния изменений, зафиксированных в репозитории, с вашими. Это означает, что `bar` будет содержать оба набора изменений. Результатов у этой операции может быть два:

- Слияние пройдёт без помех, в автоматическом режиме. Это означает, что два набора изменений не пересекаются и программа разрешила конфликт самостоятельно. В таком случае команда `svn update` выведет букву `G` (От английского слова "mer(G)ed").

- Два набора изменений пересекаются, и выведена буква `C` (от английского "(C)onflict"). Разрешить конфликт вам придётся вручную, подробности см. в соответствующей главе книги.