<?xml version="1.0" encoding="UTF-8"?>
<chapter id="misc-docs-quick_walkthrough">
  <title>Поверхностный обзор работы с системой</title>

  <simplesect>

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

  </simplesect>

  <!-- ================================================================= -->
  <!-- ======================== SECTION 1 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="misc-docs-quick_walkthrough-sect-1">
    <title>Создание репозитория</title>

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

      <screen>
$ 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
      </screen>

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

    <para>Создадим пустой репозиторий, используя приложение
      <command>svnadmin</command> :</para>

    <screen>
$ svnadmin create myrepos
    </screen>

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

    <screen>
someproject/foo
            bar
            baz/
            baz/gloo
            baz/bloo
    </screen>

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

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

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

    <sect2 id="misc-docs-quick_walkthrough-sect-1.1">
      <title>Создание рабочих копий</title>

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

      <screen>
$ 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
      </screen>

      <para>Теперь директория <filename>wc</filename> содержит
        рабочую копию, связанную с положением <filename>/myproj</filename>
        в репозитории (В предположении, что репозиторий находится по
        абсолютному пути <systemitem class="url">file:///usr/local/svn/repos</systemitem>).</para>

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

      <screen>
$ cp -R wc wc2
      </screen>

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

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

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

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

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

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

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

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

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

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

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

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

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

      <itemizedlist>

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

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

      </itemizedlist>

    </sect2>

  </sect1>

</chapter>

<!--
local variables: 
sgml-parent-document: ("misc-docs.xml" "chapter")
end:
-->
