Введение

Свободная и открытая система контроля версий программного обеспечения

Apache Subversion (часто сокращается как SVN, по названию команды svn) — это система контроля версий программного обеспечения, распространяемая как открытый исходный код под лицензией Apache. Разработчики программного обеспечения используют Subversion для ведения текущих и исторических версий файлов, таких как исходный код, веб-страницы и документация. Её цель — стать преимущественно совместимым преемником широко используемой системы Concurrent Versions System (CVS). Subversion широко используется в сообществе открытого исходного кода: например, в проектах Apache Software Foundation, FreeBSD, SourceForge, а также с 2006 по 2019 год — в GCC. Ранее CodePlex часто использовался для размещения репозиториев Subversion. Subversion была создана компанией CollabNet Inc. в 2000 году и в настоящее время является проектом Apache высшего уровня, разрабатываемым и используемым глобальным сообществом разработчиков.

История

CollabNet основал проект Subversion в 2000 году с целью создания системы управления версиями с открытым исходным кодом, работающей аналогично CVS, но исправляющей ошибки и предоставляющей некоторые функции, отсутствующие в CVS. В феврале 2004 года была выпущена версия 1.0. В ноябре 2009 года Subversion был принят в Apache Incubator, что ознаменовало начало процесса становления стандартным проектом Apache верхнего уровня. 17 февраля 2010 года он стал проектом Apache высшего уровня.

Версия | Дата выпуска | Оригинальная версия | Дата выпуска последней версии | Статус
------- | -------- | -------- | -------- | --------
2004 02 23 | 1.0.9 | 2004 10 13 | Не поддерживается
2004 09 29 | 1.1.4 | 2005 04 01 | Не поддерживается
2005 05 21 | 1.2.3 | 2005 08 19 | Не поддерживается
2005 12 30 | 1.3.2 | 2006 05 23 | Не поддерживается
2006 09 10 | 1.4.6 | 2007 12 21 | Не поддерживается
2008 06 19 | 1.5.9 | 2010 12 06 | Не поддерживается
2009 03 20 | 1.6.23 | 2013 05 30 | Не поддерживается
2011 10 11 | 1.7.22 | 2015 08 12 | Не поддерживается
2013 06 18 | 1.8.19 | 2017 08 10 | Не поддерживается
2015 08 05 | 1.9.12 | 2019 07 24 | Не поддерживается
2018 04 13 | 1.10.8 | 2022 04 12 | Не поддерживается
2018 10 30 | 1.11.1 | 2019 01 11 | Не поддерживается
2019 04 24 | 1.12.2 | 2019 07 24 | Не поддерживается
2019 10 30 | 1.13.0 | 2019 10 30 | Не поддерживается
2020 05 27 | 1.14.2 | 2023 12 20 | Полностью поддерживается, LTS
2024 | 1.15.0 | (Дата выпуска не объявлена) | В разработке

Даты выпуска извлечены из файла Apache Subversion, содержащего всю историю выпусков.

Особенности

Коммит как истинные атомарные операции (прерванные операции коммита в CVS приводили бы к несогласованности или повреждению репозитория). Система поддерживает версионность каталогов и некоторых специфических метаданных файлов (см. Свойства). Пользователи могут очень быстро перемещать или копировать файлы и целые деревья каталогов, сохраняя при этом полную историю изменений (путем ссылки на исходный объект). Версионность символических ссылок. Встроенная поддержка бинарных файлов с эффективным хранением бинарных диффов. Apache HTTP Server в качестве сетевого сервера, WebDAV/Delta V в качестве протокола. Также существует независимый серверный процесс под названием svnserve, использующий собственный протокол по TCP/IP. Разветвление реализуется копированием каталога, что является недорогой операцией, не зависящей от размера файла. Изначально клиент-серверная архитектура, многоуровневый дизайн библиотеки. Клиент-серверный протокол отправляет диффы в обоих направлениях. Вывод, пригодный для программной обработки, включая XML-журнал. Лицензия с открытым исходным кодом – лицензия Apache, начиная с релиза 1.7; предыдущие версии использовали производную от лицензии Apache 1.1. Интернационализированные сообщения программы. Блокировка файлов для неконфликтующих изменений ("зарезервированные проверки"). Авторизация на основе пути. Языковые привязки для C#, PHP, Python, Perl, Ruby и Java. Полная поддержка MIME – пользователи могут просматривать или изменять тип MIME каждого файла, а программа знает, для каких типов MIME можно отображать различия между версиями. Отслеживание слияний – слияния между ветвями будут отслеживаться, что позволяет автоматически объединять ветви без указания Subversion, какие изменения нужно или не нужно объединять. Ченджлисты для организации коммитов в группы коммитов.

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

Subversion предлагает два типа хранения репозиториев.

Беркли DB (недостаточный)

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

Свойства

Одной из важных особенностей файловой системы Subversion являются свойства — простые пары "имя=значение" в текстовом формате. Большинство свойств привязаны к элементам файловой системы (то есть файлам и каталогам). Они версионируются так же, как и любые другие изменения в файловой системе. Клиент Subversion резервирует префикс "svn:" для встроенных свойств, но для определения пользовательских свойств можно использовать любые другие имена. Делает файл исполняемым в рабочих копиях, размещенных на Unix-системах, если это поддерживается файловой системой. Хранит тип интернет-медиа ("MIME-тип") файла. Влияет на обработку патчей и слияний. Список шаблонов имен файлов, которые следует игнорировать в каталоге. Аналогично файлу cvsignore в CVS. Список ключевых слов, которые следует подставлять в файл при внесении изменений. Это используется для хранения определенной информации (например, автора, даты последнего изменения, номера ревизии) в файле без участия человека. Механизм подстановки ключевых слов берет свое начало в RCS и CVS. Заставляет клиент преобразовывать символы конца строки в текстовых файлах. Используется, когда рабочая копия требуется с определенным стилем окончания строк. Обычно используется значение "native", чтобы окончания строк соответствовали стилю операционной системы пользователя. Репозитории могут требовать установки этого свойства для всех файлов, чтобы предотвратить несогласованные окончания строк, что само по себе может вызвать проблемы. Позволяет автоматически извлекать части других репозиториев в подкаталог. Указывает, что файл должен быть извлечен с правами доступа, установленными только для чтения. Это предназначено для использования с механизмом блокировки. Право доступа только для чтения напоминает о необходимости получения блокировки перед изменением файла: получение блокировки делает файл доступным для записи, а освобождение блокировки — снова только для чтения. Блокировки применяются только во время операции коммита. Блокировки можно использовать без установки этого свойства, однако это не рекомендуется, так как существует риск изменения заблокированного файла; о блокировке станет известно только при неудачной попытке коммита. Это свойство не предназначено для непосредственной установки или изменения пользователями. Оно используется исключительно для хранения символических ссылок в репозитории. При добавлении символической ссылки в репозиторий создается файл, содержащий целевой объект ссылки, с установленным этим свойством. При извлечении этого файла в Unix-подобной системе клиент преобразует его в символическую ссылку. Используется для отслеживания данных слияния (номеров ревизий) в Subversion 1.5 и более поздних версиях. Это свойство автоматически поддерживается командой `svn merge`, и не рекомендуется изменять его значение вручную. Subversion также использует свойства для самих ревизий. Как и свойства, привязанные к элементам файловой системы, имена свойств могут быть произвольными, при этом клиент Subversion использует определенные свойства с префиксом "svn:". Однако эти свойства не версионируются и могут быть изменены позже, если это разрешено хуком pre-revprop-change. Дата и время ревизии. Имя пользователя, внесшего изменения. Описание изменений, предоставленное пользователем.

Разветвление и маркировка

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

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

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

Разработка и реализация

CollabNet продолжает поддерживать проект Subversion, однако сам проект развивается как независимое сообщество с открытым исходным кодом. В ноябре 2009 года проект был принят в Инкубатор Apache с целью стать частью деятельности Apache Software Foundation. С марта 2010 года проект официально называется Apache Subversion и является частью Apache Top Level Projects. В октябре 2009 года WANdisco объявила о найме основных разработчиков Subversion, поскольку компания стремилась стать крупным корпоративным спонсором проекта. Среди них был Хайрум Райт, президент Subversion Corporation и менеджер релизов проекта Subversion с начала 2008 года, который присоединился к компании для руководства командой разработки с открытым исходным кодом. Сообщество Subversion с открытым исходным кодом не предоставляет готовые бинарные файлы, но потенциальные пользователи могут загрузить их от добровольцев. Хотя сам проект Subversion не включает официальный графический пользовательский интерфейс (GUI) для работы с Subversion, сторонние разработчики создали ряд различных GUI, а также широкий спектр дополнительного вспомогательного программного обеспечения. Работы, анонсированные в 2009 году, включали SubversionJ (Java API) и реализацию команды Obliterate, аналогичной команде в Perforce. Оба этих улучшения были спонсированы WANdisco. Разработчики Subversion обычно одновременно работают над одной или двумя новыми функциями. В релизе 1.7 Subversion, вышедшем в октябре 2011 года, были представлены оптимизированный HTTP-транспорт для повышения производительности и переписанная библиотека рабочей копии. В 2002 году был проведен конкурс на лучший логотип Subversion. Оригинальные работы и результаты голосования за каждый логотип доступны здесь. Текущий логотип набрал наибольшее количество голосов в конкурсе.