Subversion

Поделись знанием:
Перейти к: навигация, поиск
Subversion
Тип

централизованная система управления версиями

К:Википедия:Статьи без изображений (тип: не указан)

Subversion[1] (также известная как «SVN»[2]) — свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet[en]. С 2010 года Subversion является одним из проектов Apache Software Foundation и официально называется Apache Subversion (зарегистрированный товарный знак[3]).

Цель проекта в начале разработки — заменить[4][5] распространенную на тот момент систему Concurrent Versions System (CVS), которая на сегодняшний день считается морально устаревшей[6][7][8]. Subversion реализует все основные функции CVS и свободна от ряда недостатков последней.

Subversion используется многими сообществами разработчиков открытого программного обеспечения (в том числе сообществами, ранее использовавшими CVS). В их числе такие известные проекты, как Apache, GCC, Free Pascal, Ruby, FreeBSD, AROS, Blender, Boost, Tor. Subversion также широко используется в закрытых проектах и корпоративной сфере. Хостинг Subversion, в том числе для проектов с открытым кодом, также предоставляют популярные хостинг-проекты SourceForge.net, Tigris.org, Google Code и BountySource.

В 2007 году аналитическая компания Forrester, сравнивая преимущества и недостатки различных систем, оценила Subversion как «единоличного лидера в категории Standalone Software Configuration Management (SCM) и сильного участника в категории Software Configuration and Change Management (SCCM)».[9]

По данным статистики использования пакетов Linux-дистрибутивов Debian[10] и Ubuntu[11], количество активных пользователей Subversion примерно такое же, как у Git, и превосходит аналогичный показатель для CVS, Mercurial и Bazaar (по состоянию на июнь 2011 года).

В качестве официальной документации позиционируется[12] книга издательства O’Reilly Media, выложенная в свободный доступ[13] и дописываемая авторами по мере выхода новых версий SVN. Там же публикуются её переводы на ряд языков, в том числе русский, но при том, что англоязычные версии книги сейчас описывают версии 1.6 и 1.5, на русском языке имеются лишь книги, описывающие версии до 1.4 включительно.





Содержание

История

Разработка Subversion была начата в 2000 году по инициативе и при финансовой поддержке CollabNet. Инициаторы проекта хотели создать свободную систему управления версиями, в основном похожую на CVS, но лишённую её ошибок и неудобств. В то время не существовало лучших программ этого класса со свободной лицензией, CVS была стандартом де-факто среди разработчиков свободного программного обеспечения. Выбрав её за основу, разработчики Subversion надеялись упростить разработку за счёт использования уже проверенных концепций и в то же время облегчить переход на новую систему многочисленным пользователям CVS.[14]

Основные события истории развития Subversion.

  • 31 августа 2001 года команда разработчиков перешла с CVS на Subversion для управления собственным исходным кодом: Subversion стала «самодостаточной».
  • 23 февраля 2004 года вышел релиз 1.0.0[15]. К этому времени Subversion уже использовалась примерно на 1400 серверах с открытым доступом.[16]
  • 29 сентября 2004 года появился релиз 1.1.0. Среди основных нововведений — новый формат хранилища на основе обычных файлов (FSFS), в дополнение к существовавшему ранее (с использованием Berkeley DB).[17]
  • 21 мая 2005 года вышел релиз 1.2.0, в котором добавлена возможность блокировки файлов,[18] что позволило улучшить поддержку клиентов WebDAV/DeltaV, в том числе, реализовать автоматическое создание новых версий при редактировании файлов с помощью таких клиентов. Начиная с этого релиза Subversion по умолчанию использует FSFS для новых хранилищ.
  • 30 декабря 2005 года вышел релиз 1.3.0.[19] Основными изменениями являются возможность устанавливать права доступа к директориям при использовании svnserve, дополнительные возможности команд, а также множество улучшений для разработчиков.
  • 10 сентября 2006 года вышел релиз 1.4.0.[20] Он поддерживает работу с BerkeleyDB 4.4 и может использовать её функции самовосстановления. Ранее при сбоях Subversion хранилище, использующее BerkeleyDB, могло остаться в «заклиненном» состоянии и требовалось вмешательство администратора для восстановления работы системы (при использовании FSFS этой проблемы нет).
  • 19 июня 2008 года вышел релиз 1.5.0[21], в нём сделано множество улучшений, самым значительным из которых является базовая поддержка отслеживания слияний (англ. merge tracking). Эта возможность делает процесс слияния пакетов в Subversion более простым и надёжным.
  • 20 марта 2009 года вышел релиз 1.6.0.[22] Улучшения поддержки svn:externals, обнаружение «конфликтов деревьев» (англ. tree conflict), улучшение эффективности хранения данных в репозитории и другие внесённые изменения.
  • В феврале 2010 года проект Subversion был официально переведён под управление Apache Software Foundation (ASF)[23]. Президент Subversion Corporation и директор Open Source в WANdisco выступил с видеообращением, в котором с энтузиазмом пообещал всем, что переход Subversion к ASF будет лишь способствовать более активному развитию проекта.[24]
  • 11 октября 2011 года состоялся релиз 1.7[25]. Основные улучшения: теперь только одна папка .svn в корне рабочей копии; ускорена работа по HTTP; добавлена утилита svnrdump; новая команда svn patch.
  • 18 июня 2013 года вышел релиз 1.8.0.[26] Apache Subversion 1.8 является расширением всех предыдущих выпусков Subversion.

Общие сведения

Возможности

  • Хранение полной истории изменений отслеживаемых объектов (файлов, каталогов, символьных ссылок[27]) в централизованном хранилище (репозитории), в том числе при изменении атрибутов («метаданных»), перемещении, переименовании и удалении
  • Копирование объектов с разветвлением истории — при копировании в хранилище появляются два отдельных объекта с общей историей
  • Поддержка переноса изменений между копиями объектов, в том числе полного слияния копий (в рабочей копии; без объединения истории)
  • Эмуляция[28] ветвления:
    • создания ветвей с помощью копированием директорий и последующая независимая работа с ними
    • слияние ветвей с автоматическим определением и переносом изменений
  • Эмуляция[28] меток (копированием директорий)
  • История изменений и копии объектов (в том числе ветви и метки) хранятся в виде связанных разностных копий — «дешёвых» (не требующих больших временны́х и дисковых ресурсов) при создании и хранении
  • Поддержка конкурентной (в том числе одновременной, с изоляцией транзакций) многопользовательской работы с хранилищем и, в большинстве случаев, автоматическим слиянием изменений различных разработчиков (в рабочей копии)
  • Фиксации изменений в хранилище (в том числе многообъектные) организуются в виде атомарных транзакций
  • Сетевой обмен между сервером и клиентом предусматривает передачу только различий между рабочей копией и хранилищем
  • Возможна работа как с текстовыми, так и с двоичными файлами, однако основным предназначение системы является программный код в виде текстового файла. Двоичные файлы хранятся не оптимально и не эффективно по используемому дисковому пространству и использованию процессора;
  • Различные варианты доступа к хранилищу, в том числе:
    • непосредственный доступ на локальной файловой системе;
    • по собственному сетевому протоколу;
    • через веб-сервер по протоколу WebDAV/DeltaV.
  • Вывод клиента командной строки одинаково удобен и для чтения, и для разбора программами
  • Возможность зеркалирования хранилища
  • Два возможных внутренних формата хранилища (англ. repository): база данных или набор обычных файлов
  • Интернационализированные сообщения программы (используются настройки локали)
  • Библиотеки для языков PHP, Python, Perl, Java позволяют встроить функциональность клиента Subversion в программы, написанные на этих языках
  • Многоуровневая архитектура библиотек, изначально рассчитанная на клиент-серверную модель

Модель работы

Subversion — централизованная система (в отличие от распределённых систем, таких как Git или Mercurial), то есть данные хранятся в едином хранилище. Хранилище может располагаться на локальном диске или на сетевом сервере.

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

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

При использовании доступа с помощью WebDAV также поддерживается прозрачное управление версиями — если любой клиент WebDAV открывает для записи и затем сохраняет файл, хранящийся на сетевом ресурсе, то автоматически создаётся новая версия.

Типы репозиториев

Subversion предлагает два варианта организации репозиториев[29]. Репозитории первого типа используют для хранения базы данных на основе Berkeley DB, репозитории второго типа — обычные файлы специального формата (доступ к данным организуется с помощью собственных библиотек, без использования сторонних баз данных). Разработчики Subversion часто называют хранилище «файловой системой», поэтому второй тип получил название FSFS, то есть (версионированная) файловая система (англ. File System) поверх (обычной) файловой системы.

Оба типа репозиториев обеспечивают достаточную надёжность при правильной организации[30] (Berkeley DB использует блокировки файлов, поэтому её нельзя использовать на некоторых сетевых файловых системах, не поддерживающих блокировок), каждая из них обладает своими преимуществами и недостатками. Считается, что FSFS легче правильно настроить, она требует меньшего внимания от администратора. Кроме того, до релиза 1.4 хранилища, использующие Berkeley DB могли при определённых условиях оказаться в так называемом заклиненном (англ. wedged) состоянии; требовалось вмешательство администратора для восстановления его работоспособности. Начиная с релиза 1.2 для новых хранилищ по умолчанию используется FSFS.

Доступ к репозиторию

Subversion предоставляет следующие способы доступа к репозиторию:

  • прямой доступ к репозиторию на диске (на локальной или сетевой файловой системе);
  • удалённый доступ по протоколу WebDAV/DeltaV поверх HTTP (или HTTPS) с использованием модуля mod_dav_svn для веб-сервера Apache 2;
  • удалённый доступ с использованием собственного протокола SVN:
    • на выделенном сетевом соединении (по умолчанию на TCP-порту 3690);
    • через стандартный ввод-вывод (в том числе через средства удалённого CLI, например, SSH).

Все эти способы могут быть использованы для работы с репозиториями обоих типов (FSFS и Berkeley DB). Для доступа к одному и тому же репозиторию могут одновременно использоваться разные способы.

Основные концепции

Файловая система

С точки зрения пользователя хранилище Subversion представляет собой «двумерную» файловую систему. Объекты в хранилище (файлы и директории) идентифицируются двумя «координатами»: именем и номером ревизии. Другими словами, хранилище представляет собой массив мгновенных снимков (ревизий) дерева файлов и директорий, индексируемый номером ревизии. Каждый такой снимок — обычная (одномерная) файловая система.

При необходимости указания на конкретную ревизию объекта используется запись вида: имя@ревизия, например, /main.c@29 — файл /main.c в ревизии 29. Такое указание ревизии, используемое для уточнения имени, называется стержневая ревизия (англ. peg revision).

На рис. 1 показано графическое представление файловой системы: вертикальная ось соответствует множеству имён, горизонтальная — множеству ревизий.

Имена файлов

Имя объекта файловой системы в Subversion образуется по тем же правилам, что и в UNIX-подобных операционных системах: существует только одна корневая директория, элементы пути разделяются косой чертой («/»). Объектами файловой системы являются файлы и директории (а также символические ссылки, которые эмулируются из обычных файлов путём установки атрибута svn:special).

Номера ревизий

Номер ревизии в Subversion — это натуральное число (или 0 для самой первой ревизии), адресующее номер состояния хранилища в процессе изменения содержащихся в нём данных. Каждая успешная фиксация изменений порождает ровно одну новую ревизию в хранилище, то есть N-я ревизия — это состояние хранилища после N-й фиксации.

В Subversion ревизия характеризует состояние не отдельного файла, а всего хранилища в целом. Например, ревизия 32 (обведено пунктиром на рисунке) — это состояние четырёх файлов и двух директорий, существовавших в хранилище на тот момент.

Номер ревизии является аналогом времени в том смысле, что меньшие номера ревизий соответствуют более ранним состояниям хранилища, а бо́льшие — поздним.

  • Минимальный номер ревизии 0 (ноль) соответствует изначальному состоянию хранилища, когда ещё не было зафиксировано ни одной правки. В нулевой ревизии хранилище содержит только пустую корневую директорию.
  • Максимальный номер ревизии соответствует самому последнему состоянию хранилища, то есть состоянию после фиксации последней правки. Вместо указания номера последней ревизии можно использовать ключевое слово HEAD (головная ревизия); это удобно, поскольку номер головной ревизии увеличивается при каждой фиксации изменений.

Номер ревизии можно рассматривать как некую временну́ю отметку в истории хранилища. Более того, с каждым номером ревизии связано абсолютное значение времени, когда эта ревизия была сделана (свойство svn:date). Однако указание номера ревизии удобнее, чем указание времени, так как нет путаницы с часовыми поясами, запись номера короче и номер ревизии не может быть изменён.

Оперативная и стержневая ревизии

Номер ревизии используется в двух различных контекстах:

  • оперативной ревизии (англ. operative revision);
  • стержневой ревизии (англ. peg revision).

Ревизия называется оперативной, если она указывает ревизию или диапазон ревизий, к которому должна быть применена операция, например:

svn log -r 199:230 some.path

В данном примере выполняется команда svn log для диапазона ревизий 199:230, который и является диапазоном оперативных ревизий.

Однако указание только имени файла и оперативной ревизии иногда может неоднозначно указывать на объекты хранилища. Например, в ситуации, показанной на рис. 2, возникает неоднозначность при выполнении следующей команды:

svn log -r 29:33 some.path/bar.txt

В команде указан диапазон оперативных ревизий (29:33), но области, выделенные на рисунке голубым и зелёным фоном, в равной степени можно считать историей файла /bar.txt в диапазоне ревизий 29:33. В подобных случаях необходимо указывать ещё и стержневую ревизию для разрешения неоднозначности. Стержневая ревизия — это номер ревизии, указанный в дополнение к URL объекта файловой системы (используется запись вида «URL@ревизия»). Название происходит от английского слова peg, которое можно перевести как «стержень» или «колышек». Стержневая ревизия отмечает ту цепочку состояний, которой принадлежит указанная пара URL@ревизия и, таким образом, однозначно идентифицирует объект хранилища, к которому должна быть применена команда. В приведённом ниже примере первая команда выведет историю, выделенную на рисунке голубым фоном, а вторая — историю, выделенную зелёным фоном:

svn log -r 29:33 some.path/file.txt@32
svn log -r 29:33 some.path/bar.txt@34

В качестве стержневой ревизии следует указывать как можно более позднее состояние интересующего объекта. Причина этого в том, что цепочка состояний однозначно отслеживается «назад», но не «вперёд». Например, URL со стержневой ревизией some.path/foo.txt@31 принадлежит двум цепочкам состояний (выделены соответственно зелёным и серым фоном). Из этих двух цепочек указанный URL адресует серую цепочку, то есть при движении «вперёд» от стержневой ревизии операции копирования игнорируются.

Операции над файловой системой

Над объектами файловой системы в хранилище Subversion могут быть произведены перечисленные ниже операции[31] (см. рис. 1). В скобках указано краткое именование операции в обозначениях команды svn status.

  • Добавление (A). Добавление объекта в файловую систему. Добавленный объект не имеет истории ревизий. Пример на рисунке:
  • файл /main.c был добавлен в ревизии 27.
  • Модификация (M). Модификация объекта, например, изменение содержимого файла или изменение свойств файла или директории. Пример на рисунке:
  • файл /main.c был модифицирован в ревизии 28.
  • Удаление (D). Удаление файла из головной и последующих ревизий. При этом файл остаётся в предыдущих ревизиях. Пример на рисунке:
  • файл /main.c был удалён в ревизии 30.
  • Добавление с историей (A+). Представляет собой копирование объекта внутри файловой системы хранилища, то есть объект имя_источника@ревизия_источника копируется в имя_копии@HEAD. Скопированный объект наследует от источника историю ревизий до момента копирования (наследование истории показано на рисунке пунктирными связями). Примеры на рисунке:
  • в ревизии 29 директория /tags/R1 была скопирована с директории /trunk@27;
  • в ревизии 31 файл /main.c был скопирован с /main.c@29, то есть с более ранней ревизии самого себя, таким образом, произведено восстановление ранее удалённого (в ревизии 30) файла с сохранением истории ревизий.
  • Замена (R+). Имеет место в случае, когда в одной ревизии произведено и удаление объекта (D), и добавление с историей (A+) объекта с тем же самым именем. Хотя имя при операции замены остаётся неизменным, Subversion рассматривает объект до и после замены как два различных объекта с различными историями ревизий (история старого заканчивается в точке замены, история нового наследуется от источника копирования и продолжается далее). Пример на рисунке:
  • в ревизии 30 файл /file.txt был заменён: старый файл /file.txt удалён, а новый файл с тем же именем скопирован с файла /bar.txt@29.

Фиксация изменений

Рабочая копия

Рабочая копия — это созданная клиентской программой Subversion локальная копия части данных из хранилища, содержащая помимо собственно данных некоторую служебную информацию (скрытые директории с именем .svn). Служебная информация необходима для правильного функционирования рабочей копии; что-либо менять в служебных данных нельзя. Минимальной единицей данных, которую можно получить из хранилища как рабочую копию, является директория. Содержимое директории можно извлечь не полностью: например, можно исключить отдельные файлы или поддиректории. Однако извлечь из хранилища отдельный файл как рабочую копию невозможно.

Любая поддиректория рабочей копии Subversion 1.6 и более ранних версий также является полноценной рабочей копией, поскольку в каждой директории хранятся её служебные данные (каталоги .svn). Начиная с версии 1.7 в каждой рабочей копии присутствует только одна директория .svn в корне её каталога.

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

В служебных директориях рабочей копии, помимо прочего, хранится так называемая чистая копия (англ. pristine copy) — файлы рабочей копии в неизменённом виде, как они были извлечены из хранилища (для svn это ревизия с именем BASE). Наличие чистой копии позволяет быстро и без обращения к хранилищу выполнять операции просмотра и отката локальных изменений. Однако размер рабочей копии на диске примерно в два раза больше (данные + чистая копия данных), чем размер самих данных. Такой подход обусловлен тем, что дисковые ресурсы дешевле и доступнее, чем ресурсы сети передачи данных.

Как правило, создание рабочей копии является первым и необходимым этапом для фиксации локальных изменений, поскольку зафиксировать в хранилище можно только изменения, сделанные в рабочей копии. Исключением являются операции, которые могут быть выполнены прямо в хранилище без создания рабочей копии.

Транзакции

Работа с хранилищем в Subversion организована в форме транзакций со свойствами атомарности и изоляции из набора свойств ACID. Таким образом система управления версиями гарантирует целостность, непротиворечивость и доступность хранилища в любой момент времени.

  • Атомарность фиксаций (англ. atomic commits) — изменения в нескольких файлах или директориях фиксируются единой транзакцией порождая при этом одну ревизию. В случае неудачной фиксации, при любом сбое или ошибке, система гарантирует, что хранилище не окажется в частично изменённом состоянии — в хранилище попадут либо все изменения, либо (при неудаче) — ни одного.
  • Изоляция гарантирует, что промежуточные состояния хранилища внутри транзакции не видны другим транзакциям и пользователям. Например, если один пользователь фиксирует одной транзакцией изменения в нескольких файлах, то другие пользователи не могут увидеть такого состояния хранилища, в котором часть файлов уже изменена, а часть — не изменена.

Данные свойства не гарантируются для рабочей копии Subversion — она, в отличие от хранилища, при сбое или прерывании может оказаться в промежуточном или заблокированном состоянии (то есть перед продолжением работы её потребуется восстановить командой svn cleanup или пересоздать заново).

Локальные и удалённые формы команд

Все команды клиента Subversion можно разделить на следующие группы:

  • модифицирующие рабочую копию;
  • модифицирующие хранилище;
  • модифицирующие и рабочую копию, и хранилище;
  • не модифицирующие ничего.

Структура хранилища

Структура проекта в хранилище

Формально Subversion не накладывает каких-либо ограничений на файловую структуру проекта — она может быть какой угодно в рамках правил именования объектов файловой системы. Тем не менее, существуют рекомендации, призванные облегчить работу с ветвями и метками. В простейшем случае в корневой директории хранилища рекомендуется создать как минимум три поддиректории:

/.
trunk
branches
tags

где вся файловая структура проекта (основной линии разработки) должна содержаться в поддиректории trunk, поддиректория branches должна содержать ветви проекта, а tags — метки. Например, следующая структура директорий хранилища:

/.
trunk
branches
branch_1
tags
tag_1
tag_2

предполагает наличие у проекта (trunk) одной ветви «branch_1» и двух меток «tag_1» и «tag_2». Каждая из этих директорий (trunk, branch_1, tag_1 и tag_2) содержит копию соответствующей версии проекта.

Если (под)проектов в хранилище несколько, то такая структура поддиректорий создается для каждого (под)проекта:

/.
project1
trunk
branches
tags
project2
trunk
branches
tags

то есть в корневой директории находятся директории проектов, и в каждом из них есть свои trunk, branches, tags, относящиеся только к этому проекту. Описанные структуры директорий хранилища являются лишь примерами, на практике хранилище можно организовать таким способом, который оптимально подходит в данном конкретном случае.[32][33]

Другим способом хранения нескольких проектов является создание нескольких хранилищ. В разных хранилищах следует располагать проекты, которые никак не связаны между собой, поскольку между хранилищами нельзя будет выполнить операции копирования, перемещения и слияния. Несколько хранилищ можно при необходимости объединить в одно с сохранением истории ревизий (путём импорта командой svnadmin load с параметром --parent-dir).

Ветви

Subversion использует «файловую» модель (такую же, как и в Perforce[34]) для реализации ветвей и меток, то есть ветвь является обычной директорией (можно также сделать ветвь из одного файла, а не директории). Новая ветвь создаётся командой svn copy. Ветвь может быть создана в любой директории хранилища, однако имеет смысл придерживаться описанных выше соглашений о том, где создавать новые ветви. Более подробная информация о ветвях приведена в разделах Ветвление и Слияние.

Метки

Создание метки также производится командой svn copy, то есть технически не отличается от создания ветви. Отличие только в способе использования: предполагается, что никто не будет изменять данные в метке (фиксировать в неё изменения). Например, на рис. 1 метка создана в ревизии 29: директория /trunk из ревизии 27 скопирована под именем /tags/R1. Теперь, если не изменять данные в директории /tags/R1, то она навсегда останется точной копией директории /trunk@27, то есть будет меткой.

Концепция меток, используемая в Subversion, отличается от концепции меток в других системах управления версиями. Обычно метка является символическим именем, которое адресует набор файлов и их состояние. В Subversion метка копирует набор файлов и их состояние. Метки-копии в Subversion имеют свои достоинства и недостатки.

Достоинства:

  • метка видна в структуре директорий, можно сделать удобную древовидную организацию меток.

Недостатки:

  • трудно узнать, в какие метки вошёл файл (то же для директории);
  • если права доступа установлены индивидуально[35] для директорий, то метка эти права не наследует;
  • содержимое метки может быть изменено;
  • если из метки создать рабочую копию и зафиксировать из этой рабочей копии какие-либо изменения, то это изменит саму метку, а не те данные, которые были помечены. Правильным способом работы «от метки» является создание рабочей копии не из метки, а из того, что является источником этой метки.

Свойства (properties)

Одной из важных возможностей Subversion является поддержка свойств, то есть текстовых пар имя = значение, которые могут быть установлены для объектов в хранилище. Свойства используются в двух различных контекстах: для объектов файловой системы и для ревизий.

Свойства объектов файловой системы

Каждому файлу или директории в хранилище может быть присвоен набор свойств. Изменения свойств сохраняются в истории так же, как и изменения в файловой системе. Пользователи могут устанавливать свойства с любыми именами; существует также предопределённый набор служебных свойств, которые используются клиентской программой Subversion (имена служебных свойств имеют префикс "svn: ").

Свойства файлов
svn:executable 
Делает файл исполняемым (для рабочих копий под операционными системами семейства UNIX).
svn:mime-type 
Хранит MIME-тип файла. Влияет на способ работы команд, показывающих разницу файлов, а также объединяющих изменения (merging).
svn:keywords 
Список ключевых слов (англ. keywords), которые будут заменены в файле соответствующими значениями. Чтобы замена произошла, ключевое слово должно присутствовать в файле в виде $keyword$. Используется для того, чтобы автоматически обновлять в файле значения, меняющиеся от версии к версии (например, номер ревизии).
svn:eol-style 
Определяет правило преобразования символов конца строки (англ. end-of-line, EOL) в текстовом файле. Используется в случаях, когда файл должен иметь конкретный тип символов EOL. Обычно используется «native» — при этом тип символов конца строки соответствует принятому в той операционной системе, в которой происходит создание рабочей копии.
svn:needs-lock 
Означает, что при извлечении из хранилища файл будет доступен только для чтения. Это свойство предназначено для использования совместно с механизмом блокировки. Запрет записи в файл является напоминанием того, что надо получить блокировку на этот файл, прежде чем его редактировать: при получении блокировки клиентская программа Subversion автоматически делает файл доступным для записи (снятие блокировки снова делает файл защищённым от модификаций). Блокировки могут быть использованы и без установки этого свойства. Однако делать это не рекомендуется, так как существует риск того, что другой пользователь может начать редактировать заблокированный файл, и это обнаружится только при фиксации изменений.
svn:special 
Свойство не предназначено для установки или модификации пользователями. В настоящее время используется для хранения символьных ссылок в репозитории. Когда символьная ссылка добавляется в репозиторий, в репозитории создаётся файл с установленным свойством svn:special. Когда этот файл извлекается в UNIX-подобной системе, клиентская программа Subversion преобразует его обратно в ссылку.
svn:mergeinfo 
Хранит информацию о том, из каких путей было произведено слияние в этот файл. Свойство введено в версии 1.5, оно используется для отслеживания слияний (англ. merge tracking). Представляет собой набор строк вида имя_файла: диапазон_ревизий. Здесь имя_файла — полное (с путём от корня файловой системы репозитория) имя файла или директории, откуда было произведено слияние указанного диапазона ревизий. Строки модифицируются автоматически при операциях слияния; при последующих слияниях Subversion учитывает ранее вписанные строки, избегая тем самым повторных слияний одних и тех же изменений. Не рекомендуется изменять свойство svn:mergeinfo вручную — это может нарушить механизм отслеживания слияний.
Свойства директорий
svn:ignore 
Список шаблонов имён файлов и директорий, которые клиентская программа Subversion будет игнорировать в данной директории. Это свойство аналогично файлу .cvsignore в CVS. Как правило, свойство настраивается таким образом, чтобы клиентская программа «не видела» файлы и директории, которые автоматически создаются различными программами и не должны быть версионированы (например, объектные файлы, временные файлы и т. п.). Действие этого свойства не распространяется на поддиректории.
svn:externals 
Позволяет автоматически извлечь в рабочую копию набор директорий, указав их URL (можно даже из другого хранилища).
svn:mergeinfo 
То же, что и для файлов.

Свойства ревизий

Второй тип объектов, для которых существуют свойства, — это сами ревизии. В этом случае имена свойств также могут быть любыми; некоторые свойства с префиксом "svn: " имеют специальное значение. Отличие свойств ревизий от свойств объектов файловой системы в том, что для первых понятие истории версий не применимо (поскольку конкретное значение свойства приписано одной ревизии). Другими словами, свойства ревизий можно изменить, но старое значение при этом теряется. По умолчанию изменение свойств ревизий запрещено; для разрешения администратор должен создать скрипт (англ. hook) обработки события pre-revprop-change.

svn:date 
Дата и время создания ревизии.
svn:author 
Имя пользователя, который зафиксировал изменения, вошедшие в эту ревизию.
svn:log 
Описание изменений, зафиксированных в этой ревизии (текст, введённый пользователем при фиксации изменений).

Как правило, свойства ревизий изменяются только администратором хранилища в целях исправления некорректных данных. Например, если пользователь забыл указать текстовое описание при фиксации своих изменений, то администратор может создать это описание путём редактирования свойства svn:log.

Использование Subversion

Рабочий цикл

Типичная итерация рабочего цикла с Subversion включает следующие этапы.

  • Обновление рабочей копии из хранилища (svn update) или её создание (svn checkout).
  • Изменение рабочей копии. Изменения директорий и информации о файлах производится средствами Subversion, в изменении же (содержимого) файлов Subversion никак не задействован — изменения производятся программами, предназначенными для этого (текстовые редакторы, средства разработки и т. п.):
    • новые (ещё не зафиксированные в хранилище) файлы и директории нужно добавить (команда svn add), то есть передать под управление версиями;
    • если файл или директорию в рабочей копии нужно удалить, переименовать, переместить или скопировать, необходимо использовать средства Subversion (svn mkdir, svn delete, svn move, svn copy);
    • просмотр состояния рабочей копии и локальных (ещё не зафиксированных) изменений (svn info, svn status, svn diff);
    • любые локальные изменения, если они признаны неудачными, можно откатить (svn revert).
  • При необходимости — дополнительное обновление, для получения изменений, зафиксированных в хранилище другими пользователями и слияния этих изменений со своими (svn update).
  • Фиксация своих изменений (и/или результатов слияния) в хранилище (svn commit).

Ветвление

Ветвление является важным аспектом работы систем управления версиями, поскольку типичные приёмы[36] управления версиями (по крайней мере, при разработке программного обеспечения) включают в себя использование ветвей. Subversion обладает достаточно развитыми возможностями для ветвления и слияния (однако не поддерживает слияние переименованных файлов и директорий).

На рис. 3 условно показан пример эволюции ветвей в хранилище. Зелёным цветом показана основная линия разработки проекта (англ. mainline, trunk), жёлтым — ветви, синим — метки, пурпурным — ветвь, разработка которой прекращена. Красными стрелками показаны слияния изменений.

Создание ветвей

Новая ветвь (а также метка) создаётся командой svn copy, которая создаёт в хранилище копию с наследованием истории ревизий источника (операция A+). Для создания ветвей всегда следует использовать «удалённую» форму команды svn copy, например:

svn copy .../trunk/dir .../branches/branch_name -m "Creating a branch of dir"

Полученная копия будет ветвью (или меткой, в зависимости от способа работы с ней). В дальнейшем изменения, сделанные на ветви, могут быть внесены в источник, из которого была создана эта ветвь, такое распространение изменений называется слияние (англ. merge).

Операции копирования в Subversion дешёвые (англ. cheap copy), то есть требуют небольшого фиксированного количества времени и дискового пространства. Хранилище спроектировано таким образом[37], что при любом копировании происходит не дублирование данных, а создание ссылки на источник (аналогично жёсткой ссылке), однако этот механизм чисто внутренний — с точки зрения пользователя происходит именно создание копии. Благодаря высокой эффективности создания ветвей их можно создавать настолько часто, насколько это необходимо (однако слияние — необходимое дополнение к ветвлению — выполняется в Subversion медленнее, чем в других современных системах управления версиями).

Работа с ветвями

В целом работа на ветви не отличается от работы на основной линии разработки (trunk). Специфичные команды требуются только для действий, в которых задействовано более одной ветви. К таким командам относятся (помимо команды создания ветви svn copy):

  • svn switch — переключение рабочей копии на другую ветвь — используется для того, чтобы переключить имеющуюся рабочую копию на другую ветвь. В результате переключения служебные данные рабочей копии изменяются так, как будто эта рабочая копия получена операцией svn checkout из той ветви, на которую она переключена. При этом объём сетевого трафика меньше, чем при svn checkout, так как передается только разница между данными в рабочей копии и целевой ветвью;
  • svn merge — копирование набора изменений между ветвями — используется для слияния.

Как правило, полный цикл работы с ветвями включает следующие этапы:

  • создание ветви (svn copy);
  • переключение имеющейся рабочей копии на ветвь (svn switch) или создание новой рабочей копии путём закачки (svn checkout);
  • изменение файлов и директорий в рабочей копии, фиксация этих изменений (svn commit);
  • копирование в ветвь свежих изменений из родительской ветви, сделанных после ветвления (svn merge, svn commit);
  • копирование изменений из ветви в родительскую ветвь (svn merge, svn commit);
  • удаление ветви (svn delete), если её жизненный цикл закончен.

Слияние

Копирование изменений между ветвями

Слияние в Subversion — это применение к ветви набора изменений, сделанных на другой (или той же самой) ветви. Для осуществления слияния необходимо использовать команду svn merge — она применяет набор изменений к рабочей копии; затем нужно зафиксировать внесённые изменения (svn commit).

Терминология, связанная со слиянием, несколько запутана. Термин слияние (англ. merge) является не совсем точным, поскольку как такового объединения ветвей не происходит. Кроме того, не следует отождествлять слияние и команду svn merge: во-первых, для слияния нужно выполнить (помимо svn merge) разрешение конфликтов и фиксацию, во-вторых, применение svn merge не ограничивается слиянием.

Другие применения команды svn merge

Команду svn merge можно использовать не только для слияния. Фактически команда производит внесение в рабочую копию изменений, равных разнице между двумя директориями или файлами в хранилище, поэтому svn merge является универсальным средством для переноса изменений. Можно привести такие примеры использования команды svn merge:

  • откат уже зафиксированных изменений, в том числе целого диапазона ревизий;
  • удобный просмотр (в виде изменений в рабочей копии) разницы между двумя состояниями репозитория.

Создание хранилища

Для создания хранилища используется команда svnadmin create. Эта операция создаст пустое хранилище в указанной директории.

Subversion и CVS

Сравнение

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

Параметр Subversion CVS
Возможности
Директории Отслеживает версии не только файлов, но и директорий. Версии директорий не отслеживаются, то есть структура директорий одна и та же (та, которая существует в хранилище на данный момент) для всех ревизий и всех веток. Если изменить структуру директорий, то при извлечении старых состояний получаем правильные (старые) ревизии файлов, но в неправильной (существующей на момент извлечения) структуре директорий.
Транзакции Атомарность многофайловых фиксаций. Атомарность только на уровне однофайловых фиксаций. Фактически фиксация изменений в нескольких файлах разбивается на последовательность фиксаций изменений отдельных файлов. Если такая последовательность фиксаций прервана, то часть файлов остаётся зафиксированной, часть — не зафиксированной.
Наборы изменений Наборы изменений (англ. changeset) поддерживаются. Наборы изменений не поддерживаются.
Модификации имён файлов Поддерживает копирование, перемещение и переименование файлов и директорий без потери истории изменений. При копировании, перемещении и переименовании файлов файл с новым именем не имеет никакой истории, то есть связь со старым именем и его историей версий полностью теряется. То же самое для файлов внутри директории при модификации её имени[38].
Свойства (properties) С каждым файлом и директорией может быть связан произвольный набор свойств, состоящих из названия и значения. Свойства тоже находятся под управлением версиями. Свойства не поддерживаются.
Блокировки Поддерживается необязательная блокировка файлов (начиная с версии 1.2). Блокировки не поддерживаются, но есть похожий механизм, называемый слежение.
Ветви Ветви (branch, см. словарь) реализованы в пространстве путей. Это значит, что для создания ветви производится копирование директории (копия и будет ветвью). Создание таких копий — быстрая и не ресурсоёмкая операция, потому что данные не дублируются, вместо этого фиксируется новая версия, отличающаяся от предыдущей лишь расположением файлов. Ветви реализованы в «третьем измерении». Это значит, что файл на ветви адресуется тремя параметрами: путём в файловой системе, ревизией (или другим способом указания ревизии, например, временем), именем ветви.
Метки Нет меток (tag, см. словарь) как таковых. Вместо них используется иерархия директорий — для метки создаётся отдельная директория (как и для ветви). Метка — это ветвь, в которой по договорённости больше не делают изменений. Метка является копией помеченного состояния файлов и директорий. Метки поддерживаются. Метка адресует помеченное состояние файлов.
Эффективность
Клиент-серверный обмен При любых обновлениях версий между клиентом и сервером передаются только различия между файлами, что может существенно уменьшить сетевой трафик. С сервера к клиенту передаются различия, с клиента на сервер объект передаётся полностью.
Двоичные файлы Одинаково эффективно работает как с текстовыми, так и с двоичными файлами. Работа с двоичными файлами менее эффективна: каждая новая версия сохраняется в хранилище полностью.
Создание ветвей и меток Требуется небольшое фиксированное количество времени и дискового пространства. Затраты времени велики (зависят от количества задействованных файлов). Имена ветвей и меток хранятся избыточно (во всех задействованных файлах).
Накладные расходы в рабочей копии В служебных директориях рабочей копии хранится чистая копия. Поэтому операции просмотра и отката локальных изменений выполняются быстро (без обращения к хранилищу), однако размер рабочей копии на диске примерно в два раза больше, чем размер самих данных. Чистая копия не хранится, размер рабочей копии примерно равен размеру данных. Вследствие этого операции просмотра и отката локальных изменений требуют доступа к хранилищу и выполняются медленно.
Расход памяти на сервере Меньше[39]. Больше.

Миграция с CVS на Subversion

Преобразование репозитория

Существует программа cvs2svn, предназначенная для преобразования репозитория CVS в готовый репозиторий Subversion (либо в репозиторий git) или в текстовый дамп, который можно затем импортировать в репозиторий при помощи утилиты svnadmin. При этом cvs2svn сохраняет всю информацию, содержащуюся в репозитории CVS: ветви, метки, описания изменений, имена авторов, даты фиксации изменений. Кроме того, изменения в различных файлах, зафиксированные совместно, преобразуются в одну ревизию.

Отличия в использовании

Различия в работе с файлами

В CVS операции по перемещению (переименованию) и копированию файлов и директорий выполняются повторным добавлением объекта с новым именем и (при перемещении и переименовании) удалением старого объекта. При такой работе файлы и каталоги в хранилище создаются заново и теряют историю изменений. В Subversion для выполнения этих операций должны использоваться команды перемещения (move или mv) и копирования (copy). Их использование сохраняет историю изменений и позволяет избежать лишних операций (в особенности при операциях с директориями или даже ветками файловой системы).

В отличие от CVS, некоторые операции в рабочей копии (например, удаление и перемещение файла) Subversion выполняет самостоятельно. Описанные и другие отличия при работе с файлами рабочей копии просуммированы в следующей таблице (операция commit, там где она нужна в обоих случаях, опущена):

Операция CVS Subversion Заметки
Удаление файла rm file
cvs rm file
<tt>svn rm file файл не нужно предварительно удалять вручную
Удаление файлов по маске rm *
cvs rm file1 file2 ...
<tt>svn rm * файлы не нужно предварительно удалять вручную
не нужно перечисления всех файлов
Переименование/перемещение mv file1 file2
cvs rm file1
cvs add file2
svn mv file1 file2 файл не нужно перемещать вручную
история файла сохраняется
Копирование cp file1 file2
cvs add file2
svn copy file1 file2 файл не нужно копировать вручную
история файла сохраняется (разветвляется)
Добавление (создание) директории mkdir dir
cvs add dir
svn mkdir dir
svn commit
директорию можно не создавать вручную
после добавления директории необходим commit
Добавление директории с файлами cvs add dir
cd dir
cvs add file1 file2
svn add dir директория добавляется с содержащимися в ней файлами
Переименование директории с файлами
(без поддиректорий)
mkdir dir2
cvs add dir2
mv dir1/* dir2
cvs rm dir1/file1 dir1/file2 ...
cvs add dir2/*
svn mv dir1 dir2 не нужно создавать и добавлять директории
не нужно перемещать файлы вручную
не нужно перечисления всех файлов
история файлов сохраняется
Переименование ветки файловой системы
(директории с файлами и поддиректориями)
повторять команды выше
для каждого уровня вложенности
или каждой поддиректории[40]
svn mv dir1 dir2 см. выше
не зависит от количества уровней и директорий
Адресация состояния хранилища

В Subversion для адресации состояния хранилища не обязательно создавать метки или использовать дату/время, в простых случаях (например, для получения версии после определенной фиксации) будет проще указать нужный номер ревизии.

Внутренняя структура

Уровни

Subversion спроектирован как набор библиотек, разделённых на несколько уровней. Каждый из них выполняет конкретную задачу и позволяет разработчикам создавать свои собственные инструменты, в зависимости от сложности и задачи.

Fs 
Самый низкий уровень; реализует версионированную файловую систему, которая и хранит данные.
Repos 
Уровень хранилища, реализованного на файловой системе. На этом уровне реализовано множество вспомогательных функций, а также поддерживается запуск обработчиков (англ. hooks), то есть скриптов, которые запускаются при наступлении некоторого события. Вместе уровни Fs и Repos составляют интерфейс файловой системы.
mod_dav_svn 
Обеспечивает WebDAV/Delta-V-доступ через Apache 2.
Ra 
Реализует доступ к хранилищу (и локальный, и удалённый). Начиная с этого уровня на хранилище можно ссылаться по URL, то есть
  • file:///path/ для локального доступа,
  • host/path/ или host/path/ для доступа через WebDAV, или
  • svn://host/path/ или svn+ssh://host/path/ для доступа через протокол SVN.
Client, Wc 
Самый высокий уровень. Абстрагирует доступ к хранилищу и обеспечивает выполнение типичных задач клиента, таких как аутентификация пользователя или сравнение версий. Client использует библиотеку Wc для управления локальной рабочей копией.

Конфигурация клиента

Стандартная клиентская утилита Subversion — SVN, конфигурируется переменными окружения и INI-файлами, создаваемыми в домашнем каталоге пользователя в подкаталоге .subversion (расположение конфигурации в Windows-системах, в файлах или реестре, зависит от системных настроек). В конфигурации SVN также кеширует SSL-сертификаты, логины, пароли и т. п. (если это не запрещено в конфигурации) для доступа к серверам Subversion.

Содержимое каталога .subversion:

  • файл servers — содержит информацию о способах сетевого подключения к удалённому репозиторию;
  • файл config — содержит прочую конфигурационную информацию[41]
  • каталог auth — содержит кеш серверов, сертификатов, логинов и паролей
  • файл README.txt — документация по конфигурированию SVN

Недостатки

Проблемы при переименовании файлов

Subversion не всегда может правильно обработать операции переименования файлов, если одновременно с переименованием изменяется и содержимое файла. Проблемы могут также возникнуть, если файл, переименованный в локальной копии, кто-то другой изменил в хранилище. Часть этих проблем исправлена в версии 1.5, однако это решение пока не полное.[42]

Слабая поддержка слияния ветвей

Также слабым местом Subversion считают операции слияния веток. До версии 1.5 все такие операции пользователям приходилось отслеживать вручную, с помощью подробных записей в журнале изменений. Начиная с версии 1.5 появилась базовая поддержка автоматического отслеживания слияний, которую разработчики планируют улучшить в последующих релизах[43]. В настоящее время Subversion достаточно хорошо поддерживает типовые сценарии слияния; в более сложных случаях возможны проблемы. Рекомендуется[44] организовать рабочий процесс так, чтобы избежать проблемных сценариев. Слияние переименованных файлов и директорий не поддерживается.

Невозможность удаления данных из хранилища

Информация, однажды помещённая в хранилище Subversion, остаётся там навсегда: файл можно удалить в текущей ревизии, но всегда есть возможность получить из хранилища одну из предыдущих ревизий, в которых файл существовал. Хотя сохранность прошлых ревизий и является, собственно, целью использования систем управления версиями, иногда бывает необходимо полностью удалить из хранилища информацию, попавшую туда по ошибке. В Subversion не предусмотрено для этого никакого штатного способа[45]; единственная возможность заключается в создании дампа хранилища, его обработке штатной утилитой svndumpfilter и последующем восстановлении хранилища из дампа. Существуют также сторонние программы для автоматизации этого процесса, но, в любом случае, для выполнения этой операции требуется временное прекращение доступа к хранилищу и вмешательство администратора с привилегиями, достаточно высокими для того, чтобы полностью стереть старое хранилище и заменить его новым.

Папка .svn в каждой папке

засоряет файловую структуру проекта. Начиная с версии 1.7 в корне рабочей копии проекта создаётся одна директория .svn, метаданные в которой сохраняются с использованием SQLite.

Дополнительное программное обеспечение

  • Клиенты:
  • Плагины:
  • Веб-интерфейсы:
    • Trac — инструмент, основанный на технологии Wiki,
    • Redmine — дополнительно отслеживает ошибки,
    • USVN — утилита для создания и управления доступом к репозиториям, специализирована под SVN,
    • ViewVC,
    • WebSVN,
    • SVNManager — PHP-утилита для управления репозиториями (создание, удаление, загрузка и выгрузка; управление пользователями и группами),
    • Submin — утилита для управления репозиториями и пользователями, включая управление контролем доступа к отдельным каталогам в репозитории.
  • Сравнительная таблица: веб-интерфейсы:

Наименование

Описание

Язык

БД

Лицензия

Сайт

Обновление

Версия

Trac

инструмент, основанный на технологии Wiki

Python

SQLite, PostgreSQL, MySQL и MariaDB

Модифицированная лицензия BSD

[trac.edgewall.org/ trac.edgewall.org]

31.01.2011

0.12.2

Redmine

дополнительно отслеживает ошибки

Ruby

MySQL, PostgreSQL, SQLite, Oracle.

GNU General Public License

[redmine.org/ redmine.org]

11.07.2011

1.3.0

USVN

утилита для создания и управления доступом к репозиториям, специализирована под SVN

PHP

MySQL, SQLlite

CeCill (GPL совместимая лицензия).

[www.usvn.info/ www.usvn.info]

13.01.2012

1.0.6

ViewVC

без управления пользователями, не требует поддержки DAV web-сервером.

Python

MySQL

Two-clause Berkeley-style

[www.viewvc.org/ www.viewvc.org]

02.12.2010

1.1.8

WebSVN

интерфейс просмотра к SVN

PHP

XML

GNU GPL

[websvn.tigris.org/ websvn.tigris.org]

12.10.2010

2.3.2

SVNManager

утилита для управления репозиториями (создание, удаление, загрузка и выгрузка; управление пользователями и группами)

PHP

MySQL or SQLite

[svnmanager.sourceforge.net/ svnmanager.sourceforge.net]

28.01.2012

1.09

Submin (MIT)

утилита для управления репозиториями и пользователями, включая управление контролем доступа к отдельным каталогам в репозитории

Python

[freshmeat.net/tags/mitx-consortium-license MIT/X]

24.12.2012

2.1

Напишите отзыв о статье "Subversion"

Примечания

  1. Английское слово subversion можно перевести двояко — как «свержение» (subversion) и как «подверсия» (sub-version)
  2. По названию программы-клиента для командной строки, входящей в состав пакета
  3. [www.apache.org/foundation/marks/list/ Apache Trademark Listing]
  4. [subversion.apache.org/features.html Subversion Features] (англ.)
  5. [blog.red-bean.com/sussman/?p=20 The Risks of Distributed Version Control] Бен Коллинз-Сассман  (англ.)
  6. [www.redhat.com/magazine/010aug05/features/subversion/ CVS is out, Subversion is in] (англ.) Red Hat magazine, август 2005 г.
  7. [sourceforge.net/apps/trac/sourceforge/wiki/CVS CVS — sourceforge]
  8. [www.citforum.ru/programming/application/cvs/ CVS — система управления версиями]
  9. [www.collab.net/forrester_wave_report/index.html The Forrester Wave: Software Change and Configuration Management, Q2 2007]. Forrester Research. [www.webcitation.org/61CgLWnEn Архивировано из первоисточника 25 августа 2011].
  10. [qa.debian.org/popcon-graph.php?packages=bzr%2Cgit%2Cgit-core%2Cmercurial%2Csubversion%2C+cvs&show_vote=on&want_legend=on&from_date=2006-01-01&to_date=&hlght_date=&date_fmt=%25Y-%25m&beenhere=1 Popularity contest statistics for bzr, git, git-core, mercurial, subversion]
  11. popcon.ubuntu.com/by_inst
  12. см. subversion.apache.org/docs/  (англ.)
  13. [svnbook.red-bean.com/ Version Control with Subversion]
  14. Бен Коллинз-Сассман, Брайан У. Фицпатрик, К. Майкл Пилато. [svnbook.red-bean.com/nightly/ru/svn.intro.whatis.html#svn.intro.history История Subversion /Управление версиями в Subversion] (рус.) (2007). — Для Subversion 1.4. Проверено 21 июля 2010. [www.webcitation.org/61CgMJhTd Архивировано из первоисточника 25 августа 2011].
  15. [svn.apache.org/repos/asf/subversion/trunk/CHANGES Список изменений] (англ.)
  16. [goliath.ecnext.com/coms2/gi_0199-140633/CollabNet-Primary-Sponsor-of-Subversion.html Goliath Business News]
  17. [subversion.apache.org/docs/release-notes/1.1.html Subversion 1.1 Release Notes]
  18. [subversion.apache.org/docs/release-notes/1.2.html Subversion 1.2 Release Notes]
  19. [subversion.apache.org/docs/release-notes/1.3.html Subversion 1.3 Release Notes]
  20. [subversion.apache.org/docs/release-notes/1.4.html Subversion 1.4 Release Notes]
  21. [subversion.apache.org/docs/release-notes/1.5.html Subversion 1.5 Release Notes]
  22. [subversion.apache.org/docs/release-notes/1.6.html Subversion 1.6 Release Notes]
  23. [www.nixp.ru/news/Subversion-переведена-под-контроль-Apache-Software-Foundation.html Subversion переведена под контроль Apache Software Foundation], nixp.ru
  24. [subversion.wandisco.com/jomsocial/videos/12-Subversion+the+Move+to+the+Apache+Software+Foundation.html?userid=70 Subversion & the Move to the Apache Software Foundation], (видеообращение президента Subversion Corporation)
  25. [subversion.apache.org/docs/release-notes/1.7.html Apache Subversion 1.7 Release Notes]
  26. [subversion.apache.org/docs/release-notes/1.8.html Subversion 1.8 Release Notes]
  27. работа с символьными ссылками поддерживается только в рабочих копиях под UNIX-системами
  28. 1 2 Ветви и метки в Subversion не являются независимым измерением хранилища. См. [svnbook.red-bean.com/en/1.7/svn.branchmerge.using.html#svn.branchmerge.using.concepts The Key Concepts Behind Branching]
  29. Термины хранилище и репозиторий являются синонимами.
  30. [svnbook.red-bean.com/nightly/ru/svn.reposadmin.basics.html#svn.reposadmin.basics.backends Глава 5. Администрирование хранилища] в книге «Управление версиями в Subversion»
  31. Здесь перечислены операции именно с точки зрения файловой системы хранилища. В рабочей копии действия над объектами несколько иные. Однако изменения в рабочей копии, будучи зафиксированными, вызовут в хранилище описанные здесь действия. Например, команда svn move в рабочей копии произведёт операции D, A+ в хранилище.
  32. [rsdn.ru/article/devtools/subversions.xml#EDC Структура проектов на C++ с использованием Subversion и Mxx_ru]
  33. [rsdn.ru/article/devtools/VrezkaSVN.xml Хранение сложных проектов в репозитории и установка tag’ов на несколько проектов сразу]
  34. [www.perforce.com/perforce/branch.html Inter-File Branching in Perforce]
  35. [svnbook.red-bean.com/nightly/en/svn.serverconfig.pathbasedauthz.html Path-Based Authorization]
  36. [svnbook.red-bean.com/nightly/ru/svn.branchmerge.commonuses.html Типовые примеры], раздел в книге «Управление версиями в Subversion, версия 1.4»
  37. [svn.apache.org/repos/asf/subversion/trunk/notes/subversion-design.html#server.fs.struct.bubble-up Bubble-Up Method] (англ.)
  38. В CVS директорию можно переместить прямо в хранилище средствами файловой системы, при этом файлы в нём не потеряют историю. Однако эта модификация подействует на все ревизии и ветви файлов в этой директории (поскольку в CVS директории вообще не имеют версионной информации)
  39. [subversion.apache.org/faq.html#server-requirements Subversion FAQ]
  40. более приемлемым вариантом может быть хакинг хранилища CVS — переименование каталога непосредственно в хранилище на сервере
  41. [svnbook.red-bean.com/en/1.5/svn.advanced.confarea.html#svn.advanced.confarea.opts Runtime Configuration Area. Customizing Your Subversion Experience]. Проверено 16 сентября 2010. [www.webcitation.org/61CgMlCTi Архивировано из первоисточника 25 августа 2011].
  42. [subversion.tigris.org/svn_1.5_releasenotes.html#copy-move-improvements Copy/move-related improvements in Subversion 1.5]
  43. [subversion.tigris.org/svn_1.5_releasenotes.html#merge-tracking Merge tracking (foundational)]
  44. [blogs.open.collab.net/svn/2008/07/subversion-merg.html Subversion merge reintegrate] (англ.)
  45. [subversion.tigris.org/issues/show_bug.cgi?id=516 svn obliterate]

Ссылки

  • [svnbook.red-bean.com/nightly/ru/svn-book.html Официальная книга по Subversion (русский язык)]
  • Бен Коллинз-Сассман, Брайан У. Фицпатрик, К. Майкл Пилато. [svnbook.red-bean.com/index.en.html Управление версиями в Subversion].
  • [www.collab.net/community/subversion/articles/ Статьи] на CollabNet Subversion Community  (англ.)
  • John Ferguson Smart. [www.javaworld.com/javaworld/jw-01-2008/jw-01-svnmerging.html Merging and branching in Subversion 1.5]  (англ.).
  • [blog.red-bean.com/sussman/?p=79 Version Control and «the 80 %»]  (англ.) Бен Коллинз-Сассман о будущем Subversion и о распределённых системах. [lib.custis.ru/Version_Control_and_%E2%80%9Cthe_80%25%E2%80%9D Русский перевод статьи].
  • Статья [icons4swrus.com/subversion-na-svoem-kompyutere.php «Без дизайна иконок: Репозиторий Subversion на своем компьютере»]

Отрывок, характеризующий Subversion

Он был глух и не слыхал подъезда князя Андрея. Он сидел на лавке, на которой любил сиживать старый князь, и около него было развешено лычко на сучках обломанной и засохшей магнолии.
Князь Андрей подъехал к дому. Несколько лип в старом саду были срублены, одна пегая с жеребенком лошадь ходила перед самым домом между розанами. Дом был заколочен ставнями. Одно окно внизу было открыто. Дворовый мальчик, увидав князя Андрея, вбежал в дом.
Алпатыч, услав семью, один оставался в Лысых Горах; он сидел дома и читал Жития. Узнав о приезде князя Андрея, он, с очками на носу, застегиваясь, вышел из дома, поспешно подошел к князю и, ничего не говоря, заплакал, целуя князя Андрея в коленку.
Потом он отвернулся с сердцем на свою слабость и стал докладывать ему о положении дел. Все ценное и дорогое было отвезено в Богучарово. Хлеб, до ста четвертей, тоже был вывезен; сено и яровой, необыкновенный, как говорил Алпатыч, урожай нынешнего года зеленым взят и скошен – войсками. Мужики разорены, некоторый ушли тоже в Богучарово, малая часть остается.
Князь Андрей, не дослушав его, спросил, когда уехали отец и сестра, разумея, когда уехали в Москву. Алпатыч отвечал, полагая, что спрашивают об отъезде в Богучарово, что уехали седьмого, и опять распространился о долах хозяйства, спрашивая распоряжении.
– Прикажете ли отпускать под расписку командам овес? У нас еще шестьсот четвертей осталось, – спрашивал Алпатыч.
«Что отвечать ему? – думал князь Андрей, глядя на лоснеющуюся на солнце плешивую голову старика и в выражении лица его читая сознание того, что он сам понимает несвоевременность этих вопросов, но спрашивает только так, чтобы заглушить и свое горе.
– Да, отпускай, – сказал он.
– Ежели изволили заметить беспорядки в саду, – говорил Алпатыч, – то невозмежио было предотвратить: три полка проходили и ночевали, в особенности драгуны. Я выписал чин и звание командира для подачи прошения.
– Ну, что ж ты будешь делать? Останешься, ежели неприятель займет? – спросил его князь Андрей.
Алпатыч, повернув свое лицо к князю Андрею, посмотрел на него; и вдруг торжественным жестом поднял руку кверху.
– Он мой покровитель, да будет воля его! – проговорил он.
Толпа мужиков и дворовых шла по лугу, с открытыми головами, приближаясь к князю Андрею.
– Ну прощай! – сказал князь Андрей, нагибаясь к Алпатычу. – Уезжай сам, увози, что можешь, и народу вели уходить в Рязанскую или в Подмосковную. – Алпатыч прижался к его ноге и зарыдал. Князь Андрей осторожно отодвинул его и, тронув лошадь, галопом поехал вниз по аллее.
На выставке все так же безучастно, как муха на лице дорогого мертвеца, сидел старик и стукал по колодке лаптя, и две девочки со сливами в подолах, которые они нарвали с оранжерейных деревьев, бежали оттуда и наткнулись на князя Андрея. Увидав молодого барина, старшая девочка, с выразившимся на лице испугом, схватила за руку свою меньшую товарку и с ней вместе спряталась за березу, не успев подобрать рассыпавшиеся зеленые сливы.
Князь Андрей испуганно поспешно отвернулся от них, боясь дать заметить им, что он их видел. Ему жалко стало эту хорошенькую испуганную девочку. Он боялся взглянуть на нее, по вместе с тем ему этого непреодолимо хотелось. Новое, отрадное и успокоительное чувство охватило его, когда он, глядя на этих девочек, понял существование других, совершенно чуждых ему и столь же законных человеческих интересов, как и те, которые занимали его. Эти девочки, очевидно, страстно желали одного – унести и доесть эти зеленые сливы и не быть пойманными, и князь Андрей желал с ними вместе успеха их предприятию. Он не мог удержаться, чтобы не взглянуть на них еще раз. Полагая себя уже в безопасности, они выскочили из засады и, что то пища тоненькими голосками, придерживая подолы, весело и быстро бежали по траве луга своими загорелыми босыми ножонками.
Князь Андрей освежился немного, выехав из района пыли большой дороги, по которой двигались войска. Но недалеко за Лысыми Горами он въехал опять на дорогу и догнал свой полк на привале, у плотины небольшого пруда. Был второй час после полдня. Солнце, красный шар в пыли, невыносимо пекло и жгло спину сквозь черный сюртук. Пыль, все такая же, неподвижно стояла над говором гудевшими, остановившимися войсками. Ветру не было, В проезд по плотине на князя Андрея пахнуло тиной и свежестью пруда. Ему захотелось в воду – какая бы грязная она ни была. Он оглянулся на пруд, с которого неслись крики и хохот. Небольшой мутный с зеленью пруд, видимо, поднялся четверти на две, заливая плотину, потому что он был полон человеческими, солдатскими, голыми барахтавшимися в нем белыми телами, с кирпично красными руками, лицами и шеями. Все это голое, белое человеческое мясо с хохотом и гиком барахталось в этой грязной луже, как караси, набитые в лейку. Весельем отзывалось это барахтанье, и оттого оно особенно было грустно.
Один молодой белокурый солдат – еще князь Андрей знал его – третьей роты, с ремешком под икрой, крестясь, отступал назад, чтобы хорошенько разбежаться и бултыхнуться в воду; другой, черный, всегда лохматый унтер офицер, по пояс в воде, подергивая мускулистым станом, радостно фыркал, поливая себе голову черными по кисти руками. Слышалось шлепанье друг по другу, и визг, и уханье.
На берегах, на плотине, в пруде, везде было белое, здоровое, мускулистое мясо. Офицер Тимохин, с красным носиком, обтирался на плотине и застыдился, увидав князя, однако решился обратиться к нему:
– То то хорошо, ваше сиятельство, вы бы изволили! – сказал он.
– Грязно, – сказал князь Андрей, поморщившись.
– Мы сейчас очистим вам. – И Тимохин, еще не одетый, побежал очищать.
– Князь хочет.
– Какой? Наш князь? – заговорили голоса, и все заторопились так, что насилу князь Андрей успел их успокоить. Он придумал лучше облиться в сарае.
«Мясо, тело, chair a canon [пушечное мясо]! – думал он, глядя и на свое голое тело, и вздрагивая не столько от холода, сколько от самому ему непонятного отвращения и ужаса при виде этого огромного количества тел, полоскавшихся в грязном пруде.
7 го августа князь Багратион в своей стоянке Михайловке на Смоленской дороге писал следующее:
«Милостивый государь граф Алексей Андреевич.
(Он писал Аракчееву, но знал, что письмо его будет прочтено государем, и потому, насколько он был к тому способен, обдумывал каждое свое слово.)
Я думаю, что министр уже рапортовал об оставлении неприятелю Смоленска. Больно, грустно, и вся армия в отчаянии, что самое важное место понапрасну бросили. Я, с моей стороны, просил лично его убедительнейшим образом, наконец и писал; но ничто его не согласило. Я клянусь вам моею честью, что Наполеон был в таком мешке, как никогда, и он бы мог потерять половину армии, но не взять Смоленска. Войска наши так дрались и так дерутся, как никогда. Я удержал с 15 тысячами более 35 ти часов и бил их; но он не хотел остаться и 14 ти часов. Это стыдно, и пятно армии нашей; а ему самому, мне кажется, и жить на свете не должно. Ежели он доносит, что потеря велика, – неправда; может быть, около 4 тысяч, не более, но и того нет. Хотя бы и десять, как быть, война! Но зато неприятель потерял бездну…
Что стоило еще оставаться два дни? По крайней мере, они бы сами ушли; ибо не имели воды напоить людей и лошадей. Он дал слово мне, что не отступит, но вдруг прислал диспозицию, что он в ночь уходит. Таким образом воевать не можно, и мы можем неприятеля скоро привести в Москву…
Слух носится, что вы думаете о мире. Чтобы помириться, боже сохрани! После всех пожертвований и после таких сумасбродных отступлений – мириться: вы поставите всю Россию против себя, и всякий из нас за стыд поставит носить мундир. Ежели уже так пошло – надо драться, пока Россия может и пока люди на ногах…
Надо командовать одному, а не двум. Ваш министр, может, хороший по министерству; но генерал не то что плохой, но дрянной, и ему отдали судьбу всего нашего Отечества… Я, право, с ума схожу от досады; простите мне, что дерзко пишу. Видно, тот не любит государя и желает гибели нам всем, кто советует заключить мир и командовать армиею министру. Итак, я пишу вам правду: готовьте ополчение. Ибо министр самым мастерским образом ведет в столицу за собою гостя. Большое подозрение подает всей армии господин флигель адъютант Вольцоген. Он, говорят, более Наполеона, нежели наш, и он советует все министру. Я не токмо учтив против него, но повинуюсь, как капрал, хотя и старее его. Это больно; но, любя моего благодетеля и государя, – повинуюсь. Только жаль государя, что вверяет таким славную армию. Вообразите, что нашею ретирадою мы потеряли людей от усталости и в госпиталях более 15 тысяч; а ежели бы наступали, того бы не было. Скажите ради бога, что наша Россия – мать наша – скажет, что так страшимся и за что такое доброе и усердное Отечество отдаем сволочам и вселяем в каждого подданного ненависть и посрамление. Чего трусить и кого бояться?. Я не виноват, что министр нерешим, трус, бестолков, медлителен и все имеет худые качества. Вся армия плачет совершенно и ругают его насмерть…»


В числе бесчисленных подразделений, которые можно сделать в явлениях жизни, можно подразделить их все на такие, в которых преобладает содержание, другие – в которых преобладает форма. К числу таковых, в противоположность деревенской, земской, губернской, даже московской жизни, можно отнести жизнь петербургскую, в особенности салонную. Эта жизнь неизменна.
С 1805 года мы мирились и ссорились с Бонапартом, мы делали конституции и разделывали их, а салон Анны Павловны и салон Элен были точно такие же, какие они были один семь лет, другой пять лет тому назад. Точно так же у Анны Павловны говорили с недоумением об успехах Бонапарта и видели, как в его успехах, так и в потакании ему европейских государей, злостный заговор, имеющий единственной целью неприятность и беспокойство того придворного кружка, которого представительницей была Анна Павловна. Точно так же у Элен, которую сам Румянцев удостоивал своим посещением и считал замечательно умной женщиной, точно так же как в 1808, так и в 1812 году с восторгом говорили о великой нации и великом человеке и с сожалением смотрели на разрыв с Францией, который, по мнению людей, собиравшихся в салоне Элен, должен был кончиться миром.
В последнее время, после приезда государя из армии, произошло некоторое волнение в этих противоположных кружках салонах и произведены были некоторые демонстрации друг против друга, но направление кружков осталось то же. В кружок Анны Павловны принимались из французов только закоренелые легитимисты, и здесь выражалась патриотическая мысль о том, что не надо ездить во французский театр и что содержание труппы стоит столько же, сколько содержание целого корпуса. За военными событиями следилось жадно, и распускались самые выгодные для нашей армии слухи. В кружке Элен, румянцевском, французском, опровергались слухи о жестокости врага и войны и обсуживались все попытки Наполеона к примирению. В этом кружке упрекали тех, кто присоветывал слишком поспешные распоряжения о том, чтобы приготавливаться к отъезду в Казань придворным и женским учебным заведениям, находящимся под покровительством императрицы матери. Вообще все дело войны представлялось в салоне Элен пустыми демонстрациями, которые весьма скоро кончатся миром, и царствовало мнение Билибина, бывшего теперь в Петербурге и домашним у Элен (всякий умный человек должен был быть у нее), что не порох, а те, кто его выдумали, решат дело. В этом кружке иронически и весьма умно, хотя весьма осторожно, осмеивали московский восторг, известие о котором прибыло вместе с государем в Петербург.
В кружке Анны Павловны, напротив, восхищались этими восторгами и говорили о них, как говорит Плутарх о древних. Князь Василий, занимавший все те же важные должности, составлял звено соединения между двумя кружками. Он ездил к ma bonne amie [своему достойному другу] Анне Павловне и ездил dans le salon diplomatique de ma fille [в дипломатический салон своей дочери] и часто, при беспрестанных переездах из одного лагеря в другой, путался и говорил у Анны Павловны то, что надо было говорить у Элен, и наоборот.
Вскоре после приезда государя князь Василий разговорился у Анны Павловны о делах войны, жестоко осуждая Барклая де Толли и находясь в нерешительности, кого бы назначить главнокомандующим. Один из гостей, известный под именем un homme de beaucoup de merite [человек с большими достоинствами], рассказав о том, что он видел нынче выбранного начальником петербургского ополчения Кутузова, заседающего в казенной палате для приема ратников, позволил себе осторожно выразить предположение о том, что Кутузов был бы тот человек, который удовлетворил бы всем требованиям.
Анна Павловна грустно улыбнулась и заметила, что Кутузов, кроме неприятностей, ничего не дал государю.
– Я говорил и говорил в Дворянском собрании, – перебил князь Василий, – но меня не послушали. Я говорил, что избрание его в начальники ополчения не понравится государю. Они меня не послушали.
– Все какая то мания фрондировать, – продолжал он. – И пред кем? И все оттого, что мы хотим обезьянничать глупым московским восторгам, – сказал князь Василий, спутавшись на минуту и забыв то, что у Элен надо было подсмеиваться над московскими восторгами, а у Анны Павловны восхищаться ими. Но он тотчас же поправился. – Ну прилично ли графу Кутузову, самому старому генералу в России, заседать в палате, et il en restera pour sa peine! [хлопоты его пропадут даром!] Разве возможно назначить главнокомандующим человека, который не может верхом сесть, засыпает на совете, человека самых дурных нравов! Хорошо он себя зарекомендовал в Букарещте! Я уже не говорю о его качествах как генерала, но разве можно в такую минуту назначать человека дряхлого и слепого, просто слепого? Хорош будет генерал слепой! Он ничего не видит. В жмурки играть… ровно ничего не видит!
Никто не возражал на это.
24 го июля это было совершенно справедливо. Но 29 июля Кутузову пожаловано княжеское достоинство. Княжеское достоинство могло означать и то, что от него хотели отделаться, – и потому суждение князя Василья продолжало быть справедливо, хотя он и не торопился ого высказывать теперь. Но 8 августа был собран комитет из генерал фельдмаршала Салтыкова, Аракчеева, Вязьмитинова, Лопухина и Кочубея для обсуждения дел войны. Комитет решил, что неудачи происходили от разноначалий, и, несмотря на то, что лица, составлявшие комитет, знали нерасположение государя к Кутузову, комитет, после короткого совещания, предложил назначить Кутузова главнокомандующим. И в тот же день Кутузов был назначен полномочным главнокомандующим армий и всего края, занимаемого войсками.
9 го августа князь Василий встретился опять у Анны Павловны с l'homme de beaucoup de merite [человеком с большими достоинствами]. L'homme de beaucoup de merite ухаживал за Анной Павловной по случаю желания назначения попечителем женского учебного заведения императрицы Марии Федоровны. Князь Василий вошел в комнату с видом счастливого победителя, человека, достигшего цели своих желаний.
– Eh bien, vous savez la grande nouvelle? Le prince Koutouzoff est marechal. [Ну с, вы знаете великую новость? Кутузов – фельдмаршал.] Все разногласия кончены. Я так счастлив, так рад! – говорил князь Василий. – Enfin voila un homme, [Наконец, вот это человек.] – проговорил он, значительно и строго оглядывая всех находившихся в гостиной. L'homme de beaucoup de merite, несмотря на свое желание получить место, не мог удержаться, чтобы не напомнить князю Василью его прежнее суждение. (Это было неучтиво и перед князем Василием в гостиной Анны Павловны, и перед Анной Павловной, которая так же радостно приняла эту весть; но он не мог удержаться.)
– Mais on dit qu'il est aveugle, mon prince? [Но говорят, он слеп?] – сказал он, напоминая князю Василью его же слова.
– Allez donc, il y voit assez, [Э, вздор, он достаточно видит, поверьте.] – сказал князь Василий своим басистым, быстрым голосом с покашливанием, тем голосом и с покашливанием, которым он разрешал все трудности. – Allez, il y voit assez, – повторил он. – И чему я рад, – продолжал он, – это то, что государь дал ему полную власть над всеми армиями, над всем краем, – власть, которой никогда не было ни у какого главнокомандующего. Это другой самодержец, – заключил он с победоносной улыбкой.
– Дай бог, дай бог, – сказала Анна Павловна. L'homme de beaucoup de merite, еще новичок в придворном обществе, желая польстить Анне Павловне, выгораживая ее прежнее мнение из этого суждения, сказал.
– Говорят, что государь неохотно передал эту власть Кутузову. On dit qu'il rougit comme une demoiselle a laquelle on lirait Joconde, en lui disant: «Le souverain et la patrie vous decernent cet honneur». [Говорят, что он покраснел, как барышня, которой бы прочли Жоконду, в то время как говорил ему: «Государь и отечество награждают вас этой честью».]
– Peut etre que la c?ur n'etait pas de la partie, [Может быть, сердце не вполне участвовало,] – сказала Анна Павловна.
– О нет, нет, – горячо заступился князь Василий. Теперь уже он не мог никому уступить Кутузова. По мнению князя Василья, не только Кутузов был сам хорош, но и все обожали его. – Нет, это не может быть, потому что государь так умел прежде ценить его, – сказал он.
– Дай бог только, чтобы князь Кутузов, – сказала Анпа Павловна, – взял действительную власть и не позволял бы никому вставлять себе палки в колеса – des batons dans les roues.
Князь Василий тотчас понял, кто был этот никому. Он шепотом сказал:
– Я верно знаю, что Кутузов, как непременное условие, выговорил, чтобы наследник цесаревич не был при армии: Vous savez ce qu'il a dit a l'Empereur? [Вы знаете, что он сказал государю?] – И князь Василий повторил слова, будто бы сказанные Кутузовым государю: «Я не могу наказать его, ежели он сделает дурно, и наградить, ежели он сделает хорошо». О! это умнейший человек, князь Кутузов, et quel caractere. Oh je le connais de longue date. [и какой характер. О, я его давно знаю.]
– Говорят даже, – сказал l'homme de beaucoup de merite, не имевший еще придворного такта, – что светлейший непременным условием поставил, чтобы сам государь не приезжал к армии.
Как только он сказал это, в одно мгновение князь Василий и Анна Павловна отвернулись от него и грустно, со вздохом о его наивности, посмотрели друг на друга.


В то время как это происходило в Петербурге, французы уже прошли Смоленск и все ближе и ближе подвигались к Москве. Историк Наполеона Тьер, так же, как и другие историки Наполеона, говорит, стараясь оправдать своего героя, что Наполеон был привлечен к стенам Москвы невольно. Он прав, как и правы все историки, ищущие объяснения событий исторических в воле одного человека; он прав так же, как и русские историки, утверждающие, что Наполеон был привлечен к Москве искусством русских полководцев. Здесь, кроме закона ретроспективности (возвратности), представляющего все прошедшее приготовлением к совершившемуся факту, есть еще взаимность, путающая все дело. Хороший игрок, проигравший в шахматы, искренно убежден, что его проигрыш произошел от его ошибки, и он отыскивает эту ошибку в начале своей игры, но забывает, что в каждом его шаге, в продолжение всей игры, были такие же ошибки, что ни один его ход не был совершенен. Ошибка, на которую он обращает внимание, заметна ему только потому, что противник воспользовался ею. Насколько же сложнее этого игра войны, происходящая в известных условиях времени, и где не одна воля руководит безжизненными машинами, а где все вытекает из бесчисленного столкновения различных произволов?
После Смоленска Наполеон искал сражения за Дорогобужем у Вязьмы, потом у Царева Займища; но выходило, что по бесчисленному столкновению обстоятельств до Бородина, в ста двадцати верстах от Москвы, русские не могли принять сражения. От Вязьмы было сделано распоряжение Наполеоном для движения прямо на Москву.
Moscou, la capitale asiatique de ce grand empire, la ville sacree des peuples d'Alexandre, Moscou avec ses innombrables eglises en forme de pagodes chinoises! [Москва, азиатская столица этой великой империи, священный город народов Александра, Москва с своими бесчисленными церквами, в форме китайских пагод!] Эта Moscou не давала покоя воображению Наполеона. На переходе из Вязьмы к Цареву Займищу Наполеон верхом ехал на своем соловом энглизированном иноходчике, сопутствуемый гвардией, караулом, пажами и адъютантами. Начальник штаба Бертье отстал для того, чтобы допросить взятого кавалерией русского пленного. Он галопом, сопутствуемый переводчиком Lelorgne d'Ideville, догнал Наполеона и с веселым лицом остановил лошадь.
– Eh bien? [Ну?] – сказал Наполеон.
– Un cosaque de Platow [Платовский казак.] говорит, что корпус Платова соединяется с большой армией, что Кутузов назначен главнокомандующим. Tres intelligent et bavard! [Очень умный и болтун!]
Наполеон улыбнулся, велел дать этому казаку лошадь и привести его к себе. Он сам желал поговорить с ним. Несколько адъютантов поскакало, и через час крепостной человек Денисова, уступленный им Ростову, Лаврушка, в денщицкой куртке на французском кавалерийском седле, с плутовским и пьяным, веселым лицом подъехал к Наполеону. Наполеон велел ему ехать рядом с собой и начал спрашивать:
– Вы казак?
– Казак с, ваше благородие.
«Le cosaque ignorant la compagnie dans laquelle il se trouvait, car la simplicite de Napoleon n'avait rien qui put reveler a une imagination orientale la presence d'un souverain, s'entretint avec la plus extreme familiarite des affaires de la guerre actuelle», [Казак, не зная того общества, в котором он находился, потому что простота Наполеона не имела ничего такого, что бы могло открыть для восточного воображения присутствие государя, разговаривал с чрезвычайной фамильярностью об обстоятельствах настоящей войны.] – говорит Тьер, рассказывая этот эпизод. Действительно, Лаврушка, напившийся пьяным и оставивший барина без обеда, был высечен накануне и отправлен в деревню за курами, где он увлекся мародерством и был взят в плен французами. Лаврушка был один из тех грубых, наглых лакеев, видавших всякие виды, которые считают долгом все делать с подлостью и хитростью, которые готовы сослужить всякую службу своему барину и которые хитро угадывают барские дурные мысли, в особенности тщеславие и мелочность.
Попав в общество Наполеона, которого личность он очень хорошо и легко признал. Лаврушка нисколько не смутился и только старался от всей души заслужить новым господам.
Он очень хорошо знал, что это сам Наполеон, и присутствие Наполеона не могло смутить его больше, чем присутствие Ростова или вахмистра с розгами, потому что не было ничего у него, чего бы не мог лишить его ни вахмистр, ни Наполеон.
Он врал все, что толковалось между денщиками. Многое из этого была правда. Но когда Наполеон спросил его, как же думают русские, победят они Бонапарта или нет, Лаврушка прищурился и задумался.
Он увидал тут тонкую хитрость, как всегда во всем видят хитрость люди, подобные Лаврушке, насупился и помолчал.
– Оно значит: коли быть сраженью, – сказал он задумчиво, – и в скорости, так это так точно. Ну, а коли пройдет три дня апосля того самого числа, тогда, значит, это самое сражение в оттяжку пойдет.
Наполеону перевели это так: «Si la bataille est donnee avant trois jours, les Francais la gagneraient, mais que si elle serait donnee plus tard, Dieu seul sait ce qui en arrivrait», [«Ежели сражение произойдет прежде трех дней, то французы выиграют его, но ежели после трех дней, то бог знает что случится».] – улыбаясь передал Lelorgne d'Ideville. Наполеон не улыбнулся, хотя он, видимо, был в самом веселом расположении духа, и велел повторить себе эти слова.
Лаврушка заметил это и, чтобы развеселить его, сказал, притворяясь, что не знает, кто он.
– Знаем, у вас есть Бонапарт, он всех в мире побил, ну да об нас другая статья… – сказал он, сам не зная, как и отчего под конец проскочил в его словах хвастливый патриотизм. Переводчик передал эти слова Наполеону без окончания, и Бонапарт улыбнулся. «Le jeune Cosaque fit sourire son puissant interlocuteur», [Молодой казак заставил улыбнуться своего могущественного собеседника.] – говорит Тьер. Проехав несколько шагов молча, Наполеон обратился к Бертье и сказал, что он хочет испытать действие, которое произведет sur cet enfant du Don [на это дитя Дона] известие о том, что тот человек, с которым говорит этот enfant du Don, есть сам император, тот самый император, который написал на пирамидах бессмертно победоносное имя.
Известие было передано.
Лаврушка (поняв, что это делалось, чтобы озадачить его, и что Наполеон думает, что он испугается), чтобы угодить новым господам, тотчас же притворился изумленным, ошеломленным, выпучил глаза и сделал такое же лицо, которое ему привычно было, когда его водили сечь. «A peine l'interprete de Napoleon, – говорит Тьер, – avait il parle, que le Cosaque, saisi d'une sorte d'ebahissement, no profera plus une parole et marcha les yeux constamment attaches sur ce conquerant, dont le nom avait penetre jusqu'a lui, a travers les steppes de l'Orient. Toute sa loquacite s'etait subitement arretee, pour faire place a un sentiment d'admiration naive et silencieuse. Napoleon, apres l'avoir recompense, lui fit donner la liberte, comme a un oiseau qu'on rend aux champs qui l'ont vu naitre». [Едва переводчик Наполеона сказал это казаку, как казак, охваченный каким то остолбенением, не произнес более ни одного слова и продолжал ехать, не спуская глаз с завоевателя, имя которого достигло до него через восточные степи. Вся его разговорчивость вдруг прекратилась и заменилась наивным и молчаливым чувством восторга. Наполеон, наградив казака, приказал дать ему свободу, как птице, которую возвращают ее родным полям.]
Наполеон поехал дальше, мечтая о той Moscou, которая так занимала его воображение, a l'oiseau qu'on rendit aux champs qui l'on vu naitre [птица, возвращенная родным полям] поскакал на аванпосты, придумывая вперед все то, чего не было и что он будет рассказывать у своих. Того же, что действительно с ним было, он не хотел рассказывать именно потому, что это казалось ему недостойным рассказа. Он выехал к казакам, расспросил, где был полк, состоявший в отряде Платова, и к вечеру же нашел своего барина Николая Ростова, стоявшего в Янкове и только что севшего верхом, чтобы с Ильиным сделать прогулку по окрестным деревням. Он дал другую лошадь Лаврушке и взял его с собой.


Княжна Марья не была в Москве и вне опасности, как думал князь Андрей.
После возвращения Алпатыча из Смоленска старый князь как бы вдруг опомнился от сна. Он велел собрать из деревень ополченцев, вооружить их и написал главнокомандующему письмо, в котором извещал его о принятом им намерении оставаться в Лысых Горах до последней крайности, защищаться, предоставляя на его усмотрение принять или не принять меры для защиты Лысых Гор, в которых будет взят в плен или убит один из старейших русских генералов, и объявил домашним, что он остается в Лысых Горах.
Но, оставаясь сам в Лысых Горах, князь распорядился об отправке княжны и Десаля с маленьким князем в Богучарово и оттуда в Москву. Княжна Марья, испуганная лихорадочной, бессонной деятельностью отца, заменившей его прежнюю опущенность, не могла решиться оставить его одного и в первый раз в жизни позволила себе не повиноваться ему. Она отказалась ехать, и на нее обрушилась страшная гроза гнева князя. Он напомнил ей все, в чем он был несправедлив против нее. Стараясь обвинить ее, он сказал ей, что она измучила его, что она поссорила его с сыном, имела против него гадкие подозрения, что она задачей своей жизни поставила отравлять его жизнь, и выгнал ее из своего кабинета, сказав ей, что, ежели она не уедет, ему все равно. Он сказал, что знать не хочет о ее существовании, но вперед предупреждает ее, чтобы она не смела попадаться ему на глаза. То, что он, вопреки опасений княжны Марьи, не велел насильно увезти ее, а только не приказал ей показываться на глаза, обрадовало княжну Марью. Она знала, что это доказывало то, что в самой тайне души своей он был рад, что она оставалась дома и не уехала.
На другой день после отъезда Николушки старый князь утром оделся в полный мундир и собрался ехать главнокомандующему. Коляска уже была подана. Княжна Марья видела, как он, в мундире и всех орденах, вышел из дома и пошел в сад сделать смотр вооруженным мужикам и дворовым. Княжна Марья свдела у окна, прислушивалась к его голосу, раздававшемуся из сада. Вдруг из аллеи выбежало несколько людей с испуганными лицами.
Княжна Марья выбежала на крыльцо, на цветочную дорожку и в аллею. Навстречу ей подвигалась большая толпа ополченцев и дворовых, и в середине этой толпы несколько людей под руки волокли маленького старичка в мундире и орденах. Княжна Марья подбежала к нему и, в игре мелкими кругами падавшего света, сквозь тень липовой аллеи, не могла дать себе отчета в том, какая перемена произошла в его лице. Одно, что она увидала, было то, что прежнее строгое и решительное выражение его лица заменилось выражением робости и покорности. Увидав дочь, он зашевелил бессильными губами и захрипел. Нельзя было понять, чего он хотел. Его подняли на руки, отнесли в кабинет и положили на тот диван, которого он так боялся последнее время.
Привезенный доктор в ту же ночь пустил кровь и объявил, что у князя удар правой стороны.
В Лысых Горах оставаться становилось более и более опасным, и на другой день после удара князя, повезли в Богучарово. Доктор поехал с ними.
Когда они приехали в Богучарово, Десаль с маленьким князем уже уехали в Москву.
Все в том же положении, не хуже и не лучше, разбитый параличом, старый князь три недели лежал в Богучарове в новом, построенном князем Андреем, доме. Старый князь был в беспамятстве; он лежал, как изуродованный труп. Он не переставая бормотал что то, дергаясь бровями и губами, и нельзя было знать, понимал он или нет то, что его окружало. Одно можно было знать наверное – это то, что он страдал и, чувствовал потребность еще выразить что то. Но что это было, никто не мог понять; был ли это какой нибудь каприз больного и полусумасшедшего, относилось ли это до общего хода дел, или относилось это до семейных обстоятельств?
Доктор говорил, что выражаемое им беспокойство ничего не значило, что оно имело физические причины; но княжна Марья думала (и то, что ее присутствие всегда усиливало его беспокойство, подтверждало ее предположение), думала, что он что то хотел сказать ей. Он, очевидно, страдал и физически и нравственно.
Надежды на исцеление не было. Везти его было нельзя. И что бы было, ежели бы он умер дорогой? «Не лучше ли бы было конец, совсем конец! – иногда думала княжна Марья. Она день и ночь, почти без сна, следила за ним, и, страшно сказать, она часто следила за ним не с надеждой найти призкаки облегчения, но следила, часто желая найти признаки приближения к концу.
Как ни странно было княжне сознавать в себе это чувство, но оно было в ней. И что было еще ужаснее для княжны Марьи, это было то, что со времени болезни ее отца (даже едва ли не раньше, не тогда ли уж, когда она, ожидая чего то, осталась с ним) в ней проснулись все заснувшие в ней, забытые личные желания и надежды. То, что годами не приходило ей в голову – мысли о свободной жизни без вечного страха отца, даже мысли о возможности любви и семейного счастия, как искушения дьявола, беспрестанно носились в ее воображении. Как ни отстраняла она от себя, беспрестанно ей приходили в голову вопросы о том, как она теперь, после того, устроит свою жизнь. Это были искушения дьявола, и княжна Марья знала это. Она знала, что единственное орудие против него была молитва, и она пыталась молиться. Она становилась в положение молитвы, смотрела на образа, читала слова молитвы, но не могла молиться. Она чувствовала, что теперь ее охватил другой мир – житейской, трудной и свободной деятельности, совершенно противоположный тому нравственному миру, в который она была заключена прежде и в котором лучшее утешение была молитва. Она не могла молиться и не могла плакать, и житейская забота охватила ее.
Оставаться в Вогучарове становилось опасным. Со всех сторон слышно было о приближающихся французах, и в одной деревне, в пятнадцати верстах от Богучарова, была разграблена усадьба французскими мародерами.
Доктор настаивал на том, что надо везти князя дальше; предводитель прислал чиновника к княжне Марье, уговаривая ее уезжать как можно скорее. Исправник, приехав в Богучарово, настаивал на том же, говоря, что в сорока верстах французы, что по деревням ходят французские прокламации и что ежели княжна не уедет с отцом до пятнадцатого, то он ни за что не отвечает.
Княжна пятнадцатого решилась ехать. Заботы приготовлений, отдача приказаний, за которыми все обращались к ней, целый день занимали ее. Ночь с четырнадцатого на пятнадцатое она провела, как обыкновенно, не раздеваясь, в соседней от той комнаты, в которой лежал князь. Несколько раз, просыпаясь, она слышала его кряхтенье, бормотанье, скрип кровати и шаги Тихона и доктора, ворочавших его. Несколько раз она прислушивалась у двери, и ей казалось, что он нынче бормотал громче обыкновенного и чаще ворочался. Она не могла спать и несколько раз подходила к двери, прислушиваясь, желая войти и не решаясь этого сделать. Хотя он и не говорил, но княжна Марья видела, знала, как неприятно было ему всякое выражение страха за него. Она замечала, как недовольно он отвертывался от ее взгляда, иногда невольно и упорно на него устремленного. Она знала, что ее приход ночью, в необычное время, раздражит его.
Но никогда ей так жалко не было, так страшно не было потерять его. Она вспоминала всю свою жизнь с ним, и в каждом слове, поступке его она находила выражение его любви к ней. Изредка между этими воспоминаниями врывались в ее воображение искушения дьявола, мысли о том, что будет после его смерти и как устроится ее новая, свободная жизнь. Но с отвращением отгоняла она эти мысли. К утру он затих, и она заснула.
Она проснулась поздно. Та искренность, которая бывает при пробуждении, показала ей ясно то, что более всего в болезни отца занимало ее. Она проснулась, прислушалась к тому, что было за дверью, и, услыхав его кряхтенье, со вздохом сказала себе, что было все то же.
– Да чему же быть? Чего же я хотела? Я хочу его смерти! – вскрикнула она с отвращением к себе самой.
Она оделась, умылась, прочла молитвы и вышла на крыльцо. К крыльцу поданы были без лошадей экипажи, в которые укладывали вещи.
Утро было теплое и серое. Княжна Марья остановилась на крыльце, не переставая ужасаться перед своей душевной мерзостью и стараясь привести в порядок свои мысли, прежде чем войти к нему.
Доктор сошел с лестницы и подошел к ней.
– Ему получше нынче, – сказал доктор. – Я вас искал. Можно кое что понять из того, что он говорит, голова посвежее. Пойдемте. Он зовет вас…
Сердце княжны Марьи так сильно забилось при этом известии, что она, побледнев, прислонилась к двери, чтобы не упасть. Увидать его, говорить с ним, подпасть под его взгляд теперь, когда вся душа княжны Марьи была переполнена этих страшных преступных искушений, – было мучительно радостно и ужасно.
– Пойдемте, – сказал доктор.
Княжна Марья вошла к отцу и подошла к кровати. Он лежал высоко на спине, с своими маленькими, костлявыми, покрытыми лиловыми узловатыми жилками ручками на одеяле, с уставленным прямо левым глазом и с скосившимся правым глазом, с неподвижными бровями и губами. Он весь был такой худенький, маленький и жалкий. Лицо его, казалось, ссохлось или растаяло, измельчало чертами. Княжна Марья подошла и поцеловала его руку. Левая рука сжала ее руку так, что видно было, что он уже давно ждал ее. Он задергал ее руку, и брови и губы его сердито зашевелились.
Она испуганно глядела на него, стараясь угадать, чего он хотел от нее. Когда она, переменя положение, подвинулась, так что левый глаз видел ее лицо, он успокоился, на несколько секунд не спуская с нее глаза. Потом губы и язык его зашевелились, послышались звуки, и он стал говорить, робко и умоляюще глядя на нее, видимо, боясь, что она не поймет его.
Княжна Марья, напрягая все силы внимания, смотрела на него. Комический труд, с которым он ворочал языком, заставлял княжну Марью опускать глаза и с трудом подавлять поднимавшиеся в ее горле рыдания. Он сказал что то, по нескольку раз повторяя свои слова. Княжна Марья не могла понять их; но она старалась угадать то, что он говорил, и повторяла вопросительно сказанные им слона.
– Гага – бои… бои… – повторил он несколько раз. Никак нельзя было понять этих слов. Доктор думал, что он угадал, и, повторяя его слова, спросил: княжна боится? Он отрицательно покачал головой и опять повторил то же…
– Душа, душа болит, – разгадала и сказала княжна Марья. Он утвердительно замычал, взял ее руку и стал прижимать ее к различным местам своей груди, как будто отыскивая настоящее для нее место.
– Все мысли! об тебе… мысли, – потом выговорил он гораздо лучше и понятнее, чем прежде, теперь, когда он был уверен, что его понимают. Княжна Марья прижалась головой к его руке, стараясь скрыть свои рыдания и слезы.
Он рукой двигал по ее волосам.
– Я тебя звал всю ночь… – выговорил он.
– Ежели бы я знала… – сквозь слезы сказала она. – Я боялась войти.
Он пожал ее руку.
– Не спала ты?
– Нет, я не спала, – сказала княжна Марья, отрицательно покачав головой. Невольно подчиняясь отцу, она теперь так же, как он говорил, старалась говорить больше знаками и как будто тоже с трудом ворочая язык.
– Душенька… – или – дружок… – Княжна Марья не могла разобрать; но, наверное, по выражению его взгляда, сказано было нежное, ласкающее слово, которого он никогда не говорил. – Зачем не пришла?
«А я желала, желала его смерти! – думала княжна Марья. Он помолчал.
– Спасибо тебе… дочь, дружок… за все, за все… прости… спасибо… прости… спасибо!.. – И слезы текли из его глаз. – Позовите Андрюшу, – вдруг сказал он, и что то детски робкое и недоверчивое выразилось в его лице при этом спросе. Он как будто сам знал, что спрос его не имеет смысла. Так, по крайней мере, показалось княжне Марье.
– Я от него получила письмо, – отвечала княжна Марья.
Он с удивлением и робостью смотрел на нее.
– Где же он?
– Он в армии, mon pere, в Смоленске.
Он долго молчал, закрыв глаза; потом утвердительно, как бы в ответ на свои сомнения и в подтверждение того, что он теперь все понял и вспомнил, кивнул головой и открыл глаза.
– Да, – сказал он явственно и тихо. – Погибла Россия! Погубили! – И он опять зарыдал, и слезы потекли у него из глаз. Княжна Марья не могла более удерживаться и плакала тоже, глядя на его лицо.
Он опять закрыл глаза. Рыдания его прекратились. Он сделал знак рукой к глазам; и Тихон, поняв его, отер ему слезы.
Потом он открыл глаза и сказал что то, чего долго никто не мог понять и, наконец, понял и передал один Тихон. Княжна Марья отыскивала смысл его слов в том настроении, в котором он говорил за минуту перед этим. То она думала, что он говорит о России, то о князе Андрее, то о ней, о внуке, то о своей смерти. И от этого она не могла угадать его слов.
– Надень твое белое платье, я люблю его, – говорил он.
Поняв эти слова, княжна Марья зарыдала еще громче, и доктор, взяв ее под руку, вывел ее из комнаты на террасу, уговаривая ее успокоиться и заняться приготовлениями к отъезду. После того как княжна Марья вышла от князя, он опять заговорил о сыне, о войне, о государе, задергал сердито бровями, стал возвышать хриплый голос, и с ним сделался второй и последний удар.
Княжна Марья остановилась на террасе. День разгулялся, было солнечно и жарко. Она не могла ничего понимать, ни о чем думать и ничего чувствовать, кроме своей страстной любви к отцу, любви, которой, ей казалось, она не знала до этой минуты. Она выбежала в сад и, рыдая, побежала вниз к пруду по молодым, засаженным князем Андреем, липовым дорожкам.
– Да… я… я… я. Я желала его смерти. Да, я желала, чтобы скорее кончилось… Я хотела успокоиться… А что ж будет со мной? На что мне спокойствие, когда его не будет, – бормотала вслух княжна Марья, быстрыми шагами ходя по саду и руками давя грудь, из которой судорожно вырывались рыдания. Обойдя по саду круг, который привел ее опять к дому, она увидала идущих к ней навстречу m lle Bourienne (которая оставалась в Богучарове и не хотела оттуда уехать) и незнакомого мужчину. Это был предводитель уезда, сам приехавший к княжне с тем, чтобы представить ей всю необходимость скорого отъезда. Княжна Марья слушала и не понимала его; она ввела его в дом, предложила ему завтракать и села с ним. Потом, извинившись перед предводителем, она подошла к двери старого князя. Доктор с встревоженным лицом вышел к ней и сказал, что нельзя.
– Идите, княжна, идите, идите!
Княжна Марья пошла опять в сад и под горой у пруда, в том месте, где никто не мог видеть, села на траву. Она не знала, как долго она пробыла там. Чьи то бегущие женские шаги по дорожке заставили ее очнуться. Она поднялась и увидала, что Дуняша, ее горничная, очевидно, бежавшая за нею, вдруг, как бы испугавшись вида своей барышни, остановилась.
– Пожалуйте, княжна… князь… – сказала Дуняша сорвавшимся голосом.
– Сейчас, иду, иду, – поспешно заговорила княжна, не давая времени Дуняше договорить ей то, что она имела сказать, и, стараясь не видеть Дуняши, побежала к дому.
– Княжна, воля божья совершается, вы должны быть на все готовы, – сказал предводитель, встречая ее у входной двери.
– Оставьте меня. Это неправда! – злобно крикнула она на него. Доктор хотел остановить ее. Она оттолкнула его и подбежала к двери. «И к чему эти люди с испуганными лицами останавливают меня? Мне никого не нужно! И что они тут делают? – Она отворила дверь, и яркий дневной свет в этой прежде полутемной комнате ужаснул ее. В комнате были женщины и няня. Они все отстранились от кровати, давая ей дорогу. Он лежал все так же на кровати; но строгий вид его спокойного лица остановил княжну Марью на пороге комнаты.
«Нет, он не умер, это не может быть! – сказала себе княжна Марья, подошла к нему и, преодолевая ужас, охвативший ее, прижала к щеке его свои губы. Но она тотчас же отстранилась от него. Мгновенно вся сила нежности к нему, которую она чувствовала в себе, исчезла и заменилась чувством ужаса к тому, что было перед нею. «Нет, нет его больше! Его нет, а есть тут же, на том же месте, где был он, что то чуждое и враждебное, какая то страшная, ужасающая и отталкивающая тайна… – И, закрыв лицо руками, княжна Марья упала на руки доктора, поддержавшего ее.
В присутствии Тихона и доктора женщины обмыли то, что был он, повязали платком голову, чтобы не закостенел открытый рот, и связали другим платком расходившиеся ноги. Потом они одели в мундир с орденами и положили на стол маленькое ссохшееся тело. Бог знает, кто и когда позаботился об этом, но все сделалось как бы само собой. К ночи кругом гроба горели свечи, на гробу был покров, на полу был посыпан можжевельник, под мертвую ссохшуюся голову была положена печатная молитва, а в углу сидел дьячок, читая псалтырь.
Как лошади шарахаются, толпятся и фыркают над мертвой лошадью, так в гостиной вокруг гроба толпился народ чужой и свой – предводитель, и староста, и бабы, и все с остановившимися испуганными глазами, крестились и кланялись, и целовали холодную и закоченевшую руку старого князя.


Богучарово было всегда, до поселения в нем князя Андрея, заглазное именье, и мужики богучаровские имели совсем другой характер от лысогорских. Они отличались от них и говором, и одеждой, и нравами. Они назывались степными. Старый князь хвалил их за их сносливость в работе, когда они приезжали подсоблять уборке в Лысых Горах или копать пруды и канавы, но не любил их за их дикость.
Последнее пребывание в Богучарове князя Андрея, с его нововведениями – больницами, школами и облегчением оброка, – не смягчило их нравов, а, напротив, усилило в них те черты характера, которые старый князь называл дикостью. Между ними всегда ходили какие нибудь неясные толки, то о перечислении их всех в казаки, то о новой вере, в которую их обратят, то о царских листах каких то, то о присяге Павлу Петровичу в 1797 году (про которую говорили, что тогда еще воля выходила, да господа отняли), то об имеющем через семь лет воцариться Петре Феодоровиче, при котором все будет вольно и так будет просто, что ничего не будет. Слухи о войне в Бонапарте и его нашествии соединились для них с такими же неясными представлениями об антихристе, конце света и чистой воле.
В окрестности Богучарова были всё большие села, казенные и оброчные помещичьи. Живущих в этой местности помещиков было очень мало; очень мало было также дворовых и грамотных, и в жизни крестьян этой местности были заметнее и сильнее, чем в других, те таинственные струи народной русской жизни, причины и значение которых бывают необъяснимы для современников. Одно из таких явлений было проявившееся лет двадцать тому назад движение между крестьянами этой местности к переселению на какие то теплые реки. Сотни крестьян, в том числе и богучаровские, стали вдруг распродавать свой скот и уезжать с семействами куда то на юго восток. Как птицы летят куда то за моря, стремились эти люди с женами и детьми туда, на юго восток, где никто из них не был. Они поднимались караванами, поодиночке выкупались, бежали, и ехали, и шли туда, на теплые реки. Многие были наказаны, сосланы в Сибирь, многие с холода и голода умерли по дороге, многие вернулись сами, и движение затихло само собой так же, как оно и началось без очевидной причины. Но подводные струи не переставали течь в этом народе и собирались для какой то новой силы, имеющей проявиться так же странно, неожиданно и вместе с тем просто, естественно и сильно. Теперь, в 1812 м году, для человека, близко жившего с народом, заметно было, что эти подводные струи производили сильную работу и были близки к проявлению.
Алпатыч, приехав в Богучарово несколько времени перед кончиной старого князя, заметил, что между народом происходило волнение и что, противно тому, что происходило в полосе Лысых Гор на шестидесятиверстном радиусе, где все крестьяне уходили (предоставляя казакам разорять свои деревни), в полосе степной, в богучаровской, крестьяне, как слышно было, имели сношения с французами, получали какие то бумаги, ходившие между ними, и оставались на местах. Он знал через преданных ему дворовых людей, что ездивший на днях с казенной подводой мужик Карп, имевший большое влияние на мир, возвратился с известием, что казаки разоряют деревни, из которых выходят жители, но что французы их не трогают. Он знал, что другой мужик вчера привез даже из села Вислоухова – где стояли французы – бумагу от генерала французского, в которой жителям объявлялось, что им не будет сделано никакого вреда и за все, что у них возьмут, заплатят, если они останутся. В доказательство того мужик привез из Вислоухова сто рублей ассигнациями (он не знал, что они были фальшивые), выданные ему вперед за сено.
Наконец, важнее всего, Алпатыч знал, что в тот самый день, как он приказал старосте собрать подводы для вывоза обоза княжны из Богучарова, поутру была на деревне сходка, на которой положено было не вывозиться и ждать. А между тем время не терпело. Предводитель, в день смерти князя, 15 го августа, настаивал у княжны Марьи на том, чтобы она уехала в тот же день, так как становилось опасно. Он говорил, что после 16 го он не отвечает ни за что. В день же смерти князя он уехал вечером, но обещал приехать на похороны на другой день. Но на другой день он не мог приехать, так как, по полученным им самим известиям, французы неожиданно подвинулись, и он только успел увезти из своего имения свое семейство и все ценное.
Лет тридцать Богучаровым управлял староста Дрон, которого старый князь звал Дронушкой.
Дрон был один из тех крепких физически и нравственно мужиков, которые, как только войдут в года, обрастут бородой, так, не изменяясь, живут до шестидесяти – семидесяти лет, без одного седого волоса или недостатка зуба, такие же прямые и сильные в шестьдесят лет, как и в тридцать.
Дрон, вскоре после переселения на теплые реки, в котором он участвовал, как и другие, был сделан старостой бурмистром в Богучарове и с тех пор двадцать три года безупречно пробыл в этой должности. Мужики боялись его больше, чем барина. Господа, и старый князь, и молодой, и управляющий, уважали его и в шутку называли министром. Во все время своей службы Дрон нн разу не был ни пьян, ни болен; никогда, ни после бессонных ночей, ни после каких бы то ни было трудов, не выказывал ни малейшей усталости и, не зная грамоте, никогда не забывал ни одного счета денег и пудов муки по огромным обозам, которые он продавал, и ни одной копны ужи на хлеба на каждой десятине богучаровских полей.
Этого то Дрона Алпатыч, приехавший из разоренных Лысых Гор, призвал к себе в день похорон князя и приказал ему приготовить двенадцать лошадей под экипажи княжны и восемнадцать подвод под обоз, который должен был быть поднят из Богучарова. Хотя мужики и были оброчные, исполнение приказания этого не могло встретить затруднения, по мнению Алпатыча, так как в Богучарове было двести тридцать тягол и мужики были зажиточные. Но староста Дрон, выслушав приказание, молча опустил глаза. Алпатыч назвал ему мужиков, которых он знал и с которых он приказывал взять подводы.
Дрон отвечал, что лошади у этих мужиков в извозе. Алпатыч назвал других мужиков, и у тех лошадей не было, по словам Дрона, одни были под казенными подводами, другие бессильны, у третьих подохли лошади от бескормицы. Лошадей, по мнению Дрона, нельзя было собрать не только под обоз, но и под экипажи.
Алпатыч внимательно посмотрел на Дрона и нахмурился. Как Дрон был образцовым старостой мужиком, так и Алпатыч недаром управлял двадцать лет имениями князя и был образцовым управляющим. Он в высшей степени способен был понимать чутьем потребности и инстинкты народа, с которым имел дело, и потому он был превосходным управляющим. Взглянув на Дрона, он тотчас понял, что ответы Дрона не были выражением мысли Дрона, но выражением того общего настроения богучаровского мира, которым староста уже был захвачен. Но вместе с тем он знал, что нажившийся и ненавидимый миром Дрон должен был колебаться между двумя лагерями – господским и крестьянским. Это колебание он заметил в его взгляде, и потому Алпатыч, нахмурившись, придвинулся к Дрону.
– Ты, Дронушка, слушай! – сказал он. – Ты мне пустого не говори. Его сиятельство князь Андрей Николаич сами мне приказали, чтобы весь народ отправить и с неприятелем не оставаться, и царский на то приказ есть. А кто останется, тот царю изменник. Слышишь?
– Слушаю, – отвечал Дрон, не поднимая глаз.
Алпатыч не удовлетворился этим ответом.
– Эй, Дрон, худо будет! – сказал Алпатыч, покачав головой.
– Власть ваша! – сказал Дрон печально.
– Эй, Дрон, оставь! – повторил Алпатыч, вынимая руку из за пазухи и торжественным жестом указывая ею на пол под ноги Дрона. – Я не то, что тебя насквозь, я под тобой на три аршина все насквозь вижу, – сказал он, вглядываясь в пол под ноги Дрона.
Дрон смутился, бегло взглянул на Алпатыча и опять опустил глаза.
– Ты вздор то оставь и народу скажи, чтобы собирались из домов идти в Москву и готовили подводы завтра к утру под княжнин обоз, да сам на сходку не ходи. Слышишь?
Дрон вдруг упал в ноги.
– Яков Алпатыч, уволь! Возьми от меня ключи, уволь ради Христа.
– Оставь! – сказал Алпатыч строго. – Под тобой насквозь на три аршина вижу, – повторил он, зная, что его мастерство ходить за пчелами, знание того, когда сеять овес, и то, что он двадцать лет умел угодить старому князю, давно приобрели ему славу колдуна и что способность видеть на три аршина под человеком приписывается колдунам.
Дрон встал и хотел что то сказать, но Алпатыч перебил его:
– Что вы это вздумали? А?.. Что ж вы думаете? А?
– Что мне с народом делать? – сказал Дрон. – Взбуровило совсем. Я и то им говорю…
– То то говорю, – сказал Алпатыч. – Пьют? – коротко спросил он.
– Весь взбуровился, Яков Алпатыч: другую бочку привезли.
– Так ты слушай. Я к исправнику поеду, а ты народу повести, и чтоб они это бросили, и чтоб подводы были.
– Слушаю, – отвечал Дрон.
Больше Яков Алпатыч не настаивал. Он долго управлял народом и знал, что главное средство для того, чтобы люди повиновались, состоит в том, чтобы не показывать им сомнения в том, что они могут не повиноваться. Добившись от Дрона покорного «слушаю с», Яков Алпатыч удовлетворился этим, хотя он не только сомневался, но почти был уверен в том, что подводы без помощи воинской команды не будут доставлены.
И действительно, к вечеру подводы не были собраны. На деревне у кабака была опять сходка, и на сходке положено было угнать лошадей в лес и не выдавать подвод. Ничего не говоря об этом княжне, Алпатыч велел сложить с пришедших из Лысых Гор свою собственную кладь и приготовить этих лошадей под кареты княжны, а сам поехал к начальству.

Х
После похорон отца княжна Марья заперлась в своей комнате и никого не впускала к себе. К двери подошла девушка сказать, что Алпатыч пришел спросить приказания об отъезде. (Это было еще до разговора Алпатыча с Дроном.) Княжна Марья приподнялась с дивана, на котором она лежала, и сквозь затворенную дверь проговорила, что она никуда и никогда не поедет и просит, чтобы ее оставили в покое.
Окна комнаты, в которой лежала княжна Марья, были на запад. Она лежала на диване лицом к стене и, перебирая пальцами пуговицы на кожаной подушке, видела только эту подушку, и неясные мысли ее были сосредоточены на одном: она думала о невозвратимости смерти и о той своей душевной мерзости, которой она не знала до сих пор и которая выказалась во время болезни ее отца. Она хотела, но не смела молиться, не смела в том душевном состоянии, в котором она находилась, обращаться к богу. Она долго лежала в этом положении.
Солнце зашло на другую сторону дома и косыми вечерними лучами в открытые окна осветило комнату и часть сафьянной подушки, на которую смотрела княжна Марья. Ход мыслей ее вдруг приостановился. Она бессознательно приподнялась, оправила волоса, встала и подошла к окну, невольно вдыхая в себя прохладу ясного, но ветреного вечера.
«Да, теперь тебе удобно любоваться вечером! Его уж нет, и никто тебе не помешает», – сказала она себе, и, опустившись на стул, она упала головой на подоконник.
Кто то нежным и тихим голосом назвал ее со стороны сада и поцеловал в голову. Она оглянулась. Это была m lle Bourienne, в черном платье и плерезах. Она тихо подошла к княжне Марье, со вздохом поцеловала ее и тотчас же заплакала. Княжна Марья оглянулась на нее. Все прежние столкновения с нею, ревность к ней, вспомнились княжне Марье; вспомнилось и то, как он последнее время изменился к m lle Bourienne, не мог ее видеть, и, стало быть, как несправедливы были те упреки, которые княжна Марья в душе своей делала ей. «Да и мне ли, мне ли, желавшей его смерти, осуждать кого нибудь! – подумала она.