Apache Subversion

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:02, 2 июня 2019.
Subversion
Subversion.png
Разработчики: Apache Software Foundation
Выпущена: 20 октября 2000
Операционная система: GNU/Linux, Windows, macOS, AIX, FreeBSD, NetBSD, OpenBSD, HP-UX и Solaris
Тип ПО: централизованная система управления версиями
Веб-сайт subversion.apache.org

Subversion (также известная как «SVN») — это система централизованного управления версиями с открытым исходным кодом, официально выпущенная в 2004 году компанией CollabNet, Inc. Subversion является общепризнанной централизованной системой управления версиями с открытым исходным кодом. Она характеризуется надежностью в качестве безопасного хранилища для ценных данных; простотой устройства и использования; способностью поддерживать нужды широкого круга пользователей и проектов, начиная с частных лиц и заканчивая крупными предприятиями [Источник 1].

Целью проекта являлось заменить устаревшую систему CVS и это удалось: Subversion реализует все основные функции CVS и свободна от ряда её недостатков. Subversion используется многими сообществами разработчиков открытого программного обеспечения (в том числе сообществами, ранее использовавшими CVS). В их числе такие известные проекты, как Apache Software, GCC, Free Pascal, Python, Ruby, FreeBSD, AROS, Blender 3D Suite, Boost, также широко используется в закрытых проектах и корпоративной сфере. Хостинг Subversion, в том числе для проектов с открытым кодом, также предоставляют популярные хостинг-проекты SourceForge, Tigris.org, Google Code и Bountysource.

История

В 2000 году компанией CollabNet была создана Subversion, предназначенная для написания системы управления версиями с открытым исходным кодом. Она работал также, как и CVS, но исправляла ошибки и предоставляла некоторые функции, отсутствующие в CVS. К 2001 году Subversion продвинулась достаточно далеко, чтобы разместить свой собственный исходный код. Через год Subversion уже использовалась десятками частных разработчиков и магазинов для реальной работы. После этого прошло еще два года, в течение которых происходило исправление ошибок и стабилизация, пока в феврале 2004 года не была выпущена версия 1.0. В ноябре 2009 года Subversion была принята в Apache Incubator: это ознаменовало начало процесса становления проекта Apache как продукта высшего уровня. Subversion стала проектом Apache высшего уровня 17 февраля 2010 году.[Источник 2].

Версия Последняя версия Дата выпуска Статус
Версия 1.0 1.0.9 2004-10-13 Больше не поддерживается
Версия 1.1 1.1.4 2005-04-01 Больше не поддерживается
Версия 1.2 1.2.3 2005-08-19 Больше не поддерживается
Версия 1.3 1.3.2 2006-05-23 Больше не поддерживается
Версия 1.4 1.4.6 2007-12-21 Больше не поддерживается
Версия 1.5 1.5.9 2010-12-06 Больше не поддерживается
Версия 1.6 1.6.23 2013-05-30 Больше не поддерживается
Версия 1.7 1.7.22 2015-08-12 Больше не поддерживается
Версия 1.8 1.8.19 2017-10-8 Частично поддерживается
Версия 1.9 1.9.10 2016-11-29 Полностью поддерживается
Версия 1.10 1.10.4 2019-01-11 Полностью поддерживается
Версия 1.11 1.11.1 2019-01-11 Полностью поддерживается
Версия 1.12.0 1.12.0 2019-04-24 Полностью поддерживается


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

Особенности

  • Фиксирует как истинные атомарные операции (прерывание операций фиксации в CVS может привести к несогласованности или повреждению хранилища).
  • Переименованные / скопированные / перемещенные / удаленные файлы сохраняют полную историю изменений.
  • Система поддерживает управление версиями для каталогов, переименований и метаданных файлов (но не для временных меток). Пользователи могут перемещать и /или копировать все каталоги деревьев очень быстро, сохраняя при этом полную историю изменений.
  • Управление версиями символических ссылок.
  • Встроенная поддержка двоичных файлов с пространственно-эффективным хранилищем двоичных разностей.
  • Apache HTTP Server используется в качестве сетевого сервера, WebDAV / DeltaV - для протокола. Существует также независимый серверный процесс, называемый svnserve, который использует собственный протокол через TCP/IP.
  • Ветвление - это недорогая операция, которая не зависит от размера файла (хотя Subversion не различает ветвь и каталог).
  • Собственный клиент-сервер, многоуровневая библиотека.
  • Протокол клиент/сервер отправляет дифференциалы в обоих направлениях.
  • Затраты пропорциональны размеру изменения, а не размеру данных.
  • Осуществляет синтаксический вывод, включая вывод XTML.
  • Лицензирование с открытым исходным кодом - лицензия Apache, начиная с версии 1.7. Предыдущие версии используют производную от Apache Software License 1.1.
  • Интернационализированные программные сообщения.
  • Блокировка файлов для неповрежденных файлов («зарезервированные проверки»).
  • Авторизация на основе пути.
  • Языковые привязки для C#, PHP, Python, Perl, Ruby и Java.
  • Полная поддержка MIME - пользователи могут просматривать или изменять тип MIME каждого файла, при этом программное обеспечение знает, какие типы MIME могут отличаться от предыдущих.
  • Осуществляет слежение за слияниями - слияния между ветвями будут отслежены, что позволит произвести автоматическое слияние между ветвями, без обращения к Subversion с запросами что следует, а что не следует объединять.
  • Заменяющие группы могут создавать группы фиксации. [Источник 3].

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

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

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

Subversion предлагает два типа хранилищ репозитория: Berkeley DB и FSFS.

Berkeley DB

Первоначально разработанная Subversion использовала пакет Berkeley DB. Subversion имеет некоторые ограничения на использования Berkeley DB, когда программа, которая обращается к базе данных, аварийно завершает работу или завершает ее принудительно. Потери данных или повреждения не происходит, но хранилище остается в автономном режиме пока Berkeley DB повторяет журнал и очищает все не заблокированные блокировки. Самым безопасным способам использования Subversion в репозитории Berkeley DB является единый серверный процесс, выполняющийся как для одного пользователя (а не через общую файловую систему).

FSFS

В 2004 году была разработана новая подсистема хранения с именем FSFS. Для каталогов с большим количеством файлов она работает быстрее, чем серверная часть Berkeley DB и занимает меньше места на диске из-за меньшего количества журналов. FSFS стала хранилищем данных по умолчанию для новых репозиториев, начиная с Subversion 1.2. Этимология «FSFS» основана на использовании Subversion термина «файловая система» для своей системы хранения репозитория. FSFS хранит его содержимое непосредственно в файловой системе операционной системы, а не в структурированной системе, такой как Berkeley DB. Таким образом, это «файловая система Subversion поверх файловой системы».

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

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

  • прямой доступ к репозиторию на диске (на локальной или сетевой файловой системе), к которой клиент обращается напрямую. В этом режиме используется file:///path схема доступа к файлу;
  • удалённый доступ по протоколу WebDAV/DeltaV поверх HTTP (или HTTPS) с использованием модуля mod_dav_svn для веб-сервера Apache 2. В этом режиме используется http://host/path схема доступа к файлу или https://host/path для безопасных подключений с использованием ssl;
  • удалённый доступ с использованием собственного протокола SVN: на выделенном сетевом соединении (по умолчанию на TCP-порту 3690). В этом режиме используется как svn://host/path для доступа к файлу для не зашифрованного средства сообщения или svn+ssh://host/path для туннелирования через ssh.

Все три средства могут обращаться к репозиториям FSFS и Berkeley DB. Любая версия клиента 1.x может работать с любым сервером 1.x. Новые клиенты и серверы имеют дополнительные функции и возможности производительности, но имеют резервную поддержку для старых клиентов/серверов.

Уровни

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

Fs

Низший уровень: он реализует версию файловой системы, в которой хранятся пользовательские данные.

Repos

Занимается хранилищем, созданным вокруг файловой системы. Он имеет много вспомогательных функций и обрабатывает различные «перехваты», которые может иметь репозиторий, например, скрипты, которые запускаются при выполнении действия. Вместе Fs и Repos составляют «интерфейс файловой системы».

mod_dav_svn

Обеспечивает доступ WebDAV / Delta-V через Apache 2.

Ra

Обрабатывает «доступ к репозиторию», как локальный, так и удаленный. С этого момента,например, репозитории ссылаются на использование URL-адресов.

  • file:///path/ для локального доступа,
  • http://host/path/ или https://host/path/ для WebDAV,
  • svn://host/path/ или svn+ssh://host/path/ для SVN протокола.

Client, Wc

Самый высокий уровень. Он абстрагирует доступ к репозиторию и предоставляет общие клиентские задачи, такие как проверка подлинности пользователей или сравнение версий. Клиенты Subversion используют библиотеку Wc для управления локальной рабочей копией.

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

Файловую систему Subversion можно рассматривать как «двумерную». Для однозначного обращения к элементам файловой системы используются два элемента:

  • Путь (обычный путь файловой системы);
  • Проверка (ревизия).

Каждая проверка в файловой системе Subversion имеет свой собственный root, который используется для доступа к содержимому в этой проверке. Файлы хранятся в виде ссылок на самые последние изменения; Таким образом, хранилище Subversion довольно компактное. Система потребляет пространство памяти, пропорциональное количеству внесенных изменений, а не количеству проверок. Файловая система Subversion использует транзакции, чтобы сохранить изменения атомарными. Транзакция работает с указанной версией файловой системы, но не обязательно последней. У транзакции есть свой собственный рут, на котором совершаются изменения. Это либо фиксируется, либо становится последней версией, либо прерывается. Транзакция на самом деле является долгоживущим файловым объектом; клиенту не нужно совершать или отменять транзакцию самостоятельно, он может также начать транзакцию, выйти и затем снова открыть транзакцию и продолжить ее использование. Потенциально, несколько клиентов могут получить доступ к одной и той же транзакции и работать вместе при атомарном изменении, хотя существующие клиенты не предоставляют эту возможность.

Свойства

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

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

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

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

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

Ветвление и метки

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

Рис. 1. Пример эволюции ветвей в Subversion

Ограничения и проблемы

Не секрет, что в Subversion существует проблема с переименованием файлов и каталогов. Начиная с 2014 года, Subversion реализует переименование файлов и каталогов в виде «копии» в новое имя, за которым следует «удаление» старого имени. Изменятся только имена, все данные, относящиеся к истории редактирования, остаются неизменными, и Subversion будет по-прежнему использовать старое имя в старых версиях «дерева». Проблемы могут также возникнуть, если файл, переименованный в локальной копии, кто-то другой изменил в хранилище. Часть этих проблем исправлена в версии 1.5, однако это решение пока не полное. В версии 1.8 также были рассмотрены некоторые из этих проблем, была предпринята попытка переместить записи рабочей копии как операции первого класса клиента, но до сих пор операция изменения имени файла рассматривается как "копирование+удаление" в репозитории. С 2013 года в Subversion отсутствуют некоторые функции администрирования и управления репозиторием. Например, кто-то может пожелать отредактировать репозиторий, чтобы окончательно удалить все исторические записи определенных данных.Встроенная поддержка для осуществления данного действия у Subversion отсутствует. Subversion хранит дополнительные копии данных на локальном компьютере. Это может стать проблемой при работе с очень большими проектами или файлами или если разработчики работают над несколькими ветвями одновременно. В версиях, предшествующих 1.7, эти .svn-каталоги на клиентской стороне могут стать поврежденными из-за недобросовестной активности пользователя, такой как глобальные операции поиска или замены. Начиная с версии 1.7 Subversion использует одну централизованную папку .svn для рабочей области Subversion не хранит время, когда файл был изменён. Таким образом, файл, извлеченный из репозитория Subversion, будет иметь текущую дату (вместо времени изменения в репозитории), а файл, зарегистрированный в репозитории, будет иметь дату регистрации (вместо времени изменения файла). Для преодоления этой ситуации существуют сторонние инструменты, которые позволяют сохранять время модификации и другие метаданные файловой системы. Тем не менее, давать извлечённым файлам определённую дату и время также важно - так инструменты, такие как make(1), будут замечать измененный файл для его восстановления. Subversion использует централизованную систему управления версиями. Один из разработчиков Subversion Бен Коллинз-Суссман считает, что централизованная система поможет не допустить, чтобы «опасные программисты» скрывали свою работу от других членов команды. Некоторые пользователи систем контроля версий рассматривают централизованную модель как вредную; Линус Торвальдс, как известно, атаковал модель Subversion и ее разработчиков. Subversion часто плохо справляется с нормализацией имени файла, выполняемой файловой системой HFS+. Проблемы могут возникать, когда файлы с подчёркнутыми символами в именах добавляются в репозитории в файловой системе, отличной от HFS+, и затем репозиторий используется с HFS+.

Метки и ветви

Номера ревизий трудно запомнить в любой системе контроля версий. По этой причине большинство систем предлагают символические метки в качестве удобных ссылок на них. У Subversion нет такой функции, и то, что предлагается использовать взамен, очень отличается по своей природе. Вместо того, чтобы внедрять метки в качестве ссылок на точки истории, Subversion рекомендует делать копии снимков в хорошо известном подкаталоге («метки/») в пространстве дерева репозитория. Доступны только некоторые предопределенные ссылки: HEAD, BASE, PREV и COMMITTED.

Существует ряд проблем:

1.Когда снимок сделан, система не присваивает какое-либо особое значение метке или имени снимку. Это разница между копией и ссылкой. Проверка записывается, и к снимку можно получить доступ по URL-адресу. Из-за этого использование некоторых операций становится неудобным, а иных и вовсе невозможным. Например, svn diff -r tag1: tag2 myfile не работает; тем не менее, успешное выполнение является не такой сложной задачей, как объяснение пользователю, что ему необходимо вводить URL или пути, а не только имена, чтобы добраться до моментальных снимков: svn diff <URL-TO-TAG1> / myfile <URL-TO-TAG2> / myfile. Другие операции, такие как, например, svn log -r tag1: tag2 myfile, просто невозможны. 2.Когда в дереве репозитория существуют два (в идеале независимых) типа объектов, может возникнуть «борьба за главенство». Другими словами, часто бывает трудно определить, на каком уровне создать подкаталог «метки/»:

trunk/
     /componentfoo/
     /componentbar/
tags/
    /1.1/
        /componentfoo/
        /componentbar/
 or 
componentfoo/
            /trunk/
            /tags/
                 /1.1/
componentbar/
            /trunk/
            /tags/
                 /1.1/

3.Метки, по их классическому определению, доступны как для чтения, так и для облегчения в репозитории и клиенте. Копии Subversion не доступны для чтения, и, хотя они являются легкими в репозитории, они невероятно тяжелы на клиенте. Для решения таких проблем в Subversion предложили новую функцию под названием «ярлыки» или «псевдонимы». Метки SVN будут более похожи на метки других систем, таких как CVS или Git. Тот факт, что Subversion имеет глобальные номера ревизий, открывает путь к очень простой реализации label-> revision. Однако по состоянию на 2013 год прогресс не достигнут, а символические метки не входят в список самых желаемых функций.

См. также

  1. Subversion и CVS
  1. Apache Subversion FAQ // Subversion. URL:https://subversion.apache.org/faq.html (дата обращения: 03.05.2017).
  2. Subversion // Википедия. [2017—2017]. Дата обновления: 21.01.2017. URL: http://ru.wikipedia.org/?oldid=83201752 (дата обращения: 10.05.2017).
  3. Apache Subversion // Wikipedia. [2017—2017]. Дата обновления:11.01.2017. URL:https://en.wikipedia.org/wiki/Apache_Subversion (дата обращения: 10.05.2017).
  1. Subversion [Электронный ресурс] Apache™ Subversion / Дата обращения: 21.05.19. Режим доступа - https://subversion.apache.org
  2. Svn.apache.org [Электронный ресурс] Subversion Design / Дата обращения: 21.05.19. Режим доступа - https://svn.apache.org/repos/asf/subversion/trunk/notes/subversion-design.html