|
Bog BOS: subversion (svn) - система управления версиями
|
Последнее изменение файла: 2023.08.24
Скопировано с www.bog.pp.ru: 2024.11.21
Bog BOS: subversion (svn) - система управления версиями
subversion (svn) - открытая система управления версиями
файлов и каталогов проектов с центральным репозиторием и сетевым доступом.
Система управления версиями (VCS, version control systems) предназначена для хранения всех версий
исходных файлов проекта (не результатов компиляции и сборки) и обеспечения возможности
одновременной работы с одними и теми же файлами проекта для множества участников.
Работа с ветвями позволяет сопровождать несколько версий проекта одновременно.
Разработка начата в 2001 году фирмой CollabNet Inc как "CVS без ошибок и ограничений"
под лицензией совместимой с Debian Free Software Guidelines.
В настоящее время перешёл к Apache Software Foundation (лицензия Apache 2.0).
Текущая версия 1.8.11 (декабрь 2014).
В RHEL5 пакет subversion.x86_64 и mod_dav_svn.x86_64 версии 1.4.2-4.el5_3.1
(новые версии на rpmforge).
В FC10 - subversion.x86_64 и mod_dav_svn.x86_64 версии 1.6.5-1.fc10.1.
В RHEL6: svnkit и eclipse-svnkit 1.3.0, kdesvn 1.5.5, subversion и mod_dav_svn 1.6.11,
cvs2svn 2.3.0 (DAG), rapidsvn 0.12.0, websvn 2.3.3.
Имеющийся каталог проекта ставится под контроль системы управления версиями
импортированием каталога в репозиторий. Обратная операция - экспорт каталога из репозитория.
При редактировании файлов репозитория используется модель copy-modify-merge (противоположность lock-modify-unlock):
- из репозитория извлекается рабочая копия (выгрузка, checkout)
- в рабочую копию вносятся локальные изменения (изменение файловой структуры необходимо делать с помощью команд svn)
- изменённая рабочая копия сохраняется в репозиторий
(фиксация изменений, commit, единая транзакция, номер ревизии репозитория увеличивается на 1)
Если сохранить рабочую копию невозможно из-за изменений, внесённых другими за истекший промежуток времени,
то пользователь должен извлечь накопившиеся изменения из репозитория в рабочую копию (update)
с автоматическим или ручным двухпозиционным слиянием (diff) своих и чужих изменений, затем попытаться сохранить
результат слияния в репозиторий (пока там ещё кто-нибудь не внёс изменения).
Рабочую копию можно использовать для последующего редактирования файлов.
Все зафиксированные изменения файлов и каталогов (версии, ревизии) в репозитории хранятся вечно.
Изменения репозитория являются атомарными (неделимыми), представляются в виде неделимого набора изменений файлов и каталогов.
Номер ревизии является общим для всего репозитория, а не для файла или каталога.
Сервер не отслеживает рабочие копии.
Внутри рабочей копии хранятся метакаталоги (.svn) и могут быть "посторонние" файлы.
С рабочей копией не стоит обращаться как с обычными файлами (разве что можно удалить после фиксации изменений),
а копировать только через фиксацию и выгрузку.
Репозиторий не стоит рассматривать как удалённое файловое хранилище.
При обновлении из репозитория текущие изменения рабочей копии не записываются в репозиторий,
а при записи в репозиторий не производится обновление,
в результате файлы рабочей копии имеют различные номера версии.
subversion позволяет работать не только с последовательностью ревизий проекта,
но и с деревом ревизий (расщепление).
К сожалению, это дерево является виртуальным (воображаемым), т.к. в subversion ревизии реализованы
с помощью механизма "быстрого копирования подкаталогов" и на посторонний взгляд неотличимы от подкаталогов проекта.
Отображение дерева каталогов на дерево ревизий необходимо производить "в уме".
Это обеспечивает гибкость при выборе методики использования (структуры ветвей, подпроекты, несколько проектов в репозитории)
за счёт усложнения рабочих процедур (и потере понимания происходящего у некоторых участников:
команда копирования используется как для копирования каталога, так и для создания ветви;
команда слияния используется как для внесения изменений в исходной ветви в новую,
так и для возврата изменений новой ветви в исходную).
Конфликты слияния ревизий (наложение разности ревизий на целевую ревизию, трёхпозиционное слияние, diff3)
разрешаются аналогично конфликтам фиксации изменений.
В версии 1.5 реализована поддержка слияния (объединения, merge) ветвей
в виде сохранения информации о проведённых слияниях и учёта их в дальнейшем.
Клиентские приложения (командной строки - svn, svnversion;
графические, встроенные в систему разработки - Eclipse, расширители менеджера файлов - TortoiseSVN)
через API интерфейса клиента вызывают фукции клиентской библиотеки subversion, которая хранит рабочую
копию проекта (с помощью библиотеки управления рабочей копией)
и взаимодействуют (Repository Access, RA) с репозиторием subversion
- напрямую (интерфейс репозитория на локальном хосте, file:///, аутентификация средствами системы,
авторизация средствами файловой системы)
- с помощью протокола SVN (stateful) через сервер svnserve
(запускается как сервис, svn://, аутентификация и авторизация средствами SASL, шифрование - SASL, нет журнала)
- с помощью SSH запуская личный сервер svnserve на удалённом хосте
для локального доступа к файлам репозитория (svn+ssh://, аутентификация средствами системы,
авторизация средствами файловой системы, шифрование - SSH)
- с помощью протокола WebDAV (подмножество DeltaV с расширением)
с использованием модулей mod_dav и mod_dav_svn сервера Apache
(http:// или https://, аутентификация и авторизация средствами Apache, шифрование - SSL/TLS, медленнее на 10%);
возможен просмотр репозитория с помощью обычного браузера (для доступа к нужной ревизии добавить '?r=номер&p=PEG');
возможно редактирование с помощью WebDAV клиентов
К одному репозиторию можно обращаться одновременно различными способами.
Рекомендуется завести отдельного пользователя (svn) и приписать все файлы репозитория и процессы сервера ему.
Обслуживающие программы: svnadmin, svnlook, svndumpfilter, svnsync.
Каждый репозиторий имеет уникальный UUID, котрый используется клиентами для проверки.
Имена файлов и сообщения журнала хранятся в UTF-8.
При синхронизации рабочей копии используются механизмы журнализации
(для предотвращения проблем с неполной синхронизацией)
и блокировки (для предотвращения одновременных изменений несколькими клиентами).
При хранении репозитория используется модель моментальных снимков, разница между последовательными ревизиями
представляется как заплатка (patch, сжатая в версии 1.4),
а сама ревизия как последовательность заплаток, создающая дерево файлов.
В версии 1.6 группы старых ревизий (по 1000 штук) упаковываются в пакеты для ускорения доступа.
Рабочая копия хранится на хосте пользователя как дерево каталогов файлов проекта
и административный каталог '.svn' для каждого каталога проекта, в котором
для каждого файла хранится время извлечения из репозитория и номер ревизии репозитория, на которой он основан.
Здесь же (.svn/text-base/) кешируются исходные версии всех файлов
и исходные метаданные (.svn/prop-base и .svn/dir-prop-base),
что позволяет откатывать изменения и делать отчёты без сетевого соединения,
а также сохранять изменения в виде разности файлов (delta).
Если его случайно испортить, то придётся удалять каталог рабочей копии и обновлять её (svn update).
При синхронизации делается временная копия в .svn/tmp (при сбое становится постоянной ;).
Таким образом требуется троекратный объём файлового пространства.
Аутентификация по требованию сервера
с кешированием в ~/.subversion/auth/ (хост, порт, область действия), т.е. если производится checkout
на каталог, который доступен анонимному пользователю, то аутентификация не производится
и закрытые для анонимного пользователя подкаталоги не будут считаны.
При кешировании паролей может использоваться GNOME Keyring или KDE Wallet или они хранятся в открытом виде.
Обеспечивается работа с ветвями проектов (branch,
независимые линии разработки проектов, имеющие общую историю)
и отмеченными версиями (tag, неизменяемый слепок), что требуется для одновременной поддержки несколько версий проекта.
Ответвлять можно как от основного ствола (trunk), так и от одной из предыдущих веток.
Реализовано как копирование дерева файлов проекта (имя-проекта/trunk) в отдельный каталог (имя-проекта/branches/имя-ветви),
в системе нет понятия "ветвь" и "отмеченная версия", но есть хранение истории происхождения и поддержка
копирования изменений между исходным деревом и ветвью (merging).
Возможна "вывернутая" файловая иерархия: trunk/имя-проекта, branches/имя-проекта/имя-ветви.
При использовании другой файловой иерархии придётся дополнительно обучать новичков и дорабатывать стороннее ПО.
В дополнение к служебным метаданным о файлах (ревизия, дата) репозиторий позволяет хранить
и отслеживать ревизии произвольных свойств (properties) файлов и каталогов. Каждое свойство имеет имя и значение.
Имена служебных свойств начинаются с 'svn:'
- svn:executable=* - для установки прав доступа
- svn:mime-type - для отличия текстовых и двоичных файлов
- svn:eol-style={native | CRLF | LF | CR} - для автоматического преобразования
- svn:ignore=список-шаблонов-имён-файлов-через-NL - для игнорирования "посторонних" файлов в данном каталоге
- svn:keywords=список-ключевых-слов - для подстановки
- svn:needs-lock - для напоминания о необходимости захвата файла
перед редактированием (файл извлекается с правами только на чтение, если замок не установлен)
- svn:mergeinfo - для хранении информации об уже произведённых слияниях
- svn:externals - позволяет установить постоянное отображение между каталогами одного репозитория с указанием ревизии
и локальными каталогами для автоматически подключаемых вложенных подпроектов (в версии 1.5 появилась возможность
использовать относительные адреса, в версии 1.6 - устанавливать соотношения на уровне файлов)
- svn:sync-* - хранят информацию о синхронизации
- svn:special - файл является символьной ссылкой
Ревизии в целом также могут иметь свойства (ревизии свойств ревизии не поддерживаются):
- svn:date (время сервера в UTC)
- svn:author
- svn:log (комментарий)
- svn:autoversioned (ревизия была создана автоматически средствами WebDAV)
При обработке текстовых файлов в момент синхронизации
возможна замена ключевых слов на стороне клиента текущими значениями
(ищутся и заменяются шаблоны '$КлючевоеСлово$' или '$КлючевоеСлово: ... $'):
- LastChangedDate или Date
- LastChangedRevision или Revision или Rev
- LastChangedBy или Author
- HeadURL или URL
- Id
При указании объекта может быть использована уточняющая версия
(peg, записывается после имени объекта и символа '@'),
которая позволяет различать объекты, которые в процессе развития проекта имели одно и то же имя
(поиск всегда идёт назад по времени). По умолчанию, уточняющей версией для рабочей копии является BASE
(ревизия на момент последней выгрузки), а для репозитория - HEAD (последняя ревизия на данный момент).
В версии 1.5 реализован механизм пометок файлов рабочей копии
под названием changelists (одна метка на файл).
Можно помечать файлы, удалять пометки, ограничивать множество затрагиваемых операциями файлов по наличию пометок.
Предполагается, что изменения в файлах доступны для слияний (программы, тексты, но не звук или видео),
в противном случае предлагается использовать механизм блокировок: файл блокируется специальной командой создания замка
(в рабочей копии д.б. последняя ревизия; замок хранит имя владельца и уникальный идентификатор,
который сообщается владельцу; замок кешируется в рабочей копии; любой может извлечь из репозитория командой info);
при попытке сохранить или удалить этот файл система требует предъявить идентификатор замка
(при успехе все найденные локальным клиентом замки уничтожаются); замок можно снять специальной командой
или сломать (администратор может сделать это непосредственно утилитами svnlook и svnadmin,
обычный пользовать с помощью опции --force) или украсть (перевести на себя).
Т.е. замок надо рассматривать не как охранное устройство, а как средство коммуникации.
Рекомендуемая методика работы (увеличивает вероятность раннего обнаружения проблемы,
облегчает изучение истории проекта) для недебютной фазы разработки:
исправление каждой ошибки или добавление функции (задача в системе управления заявками, issue tracking)
делается в отдельно создаваемой ветке (имя ветви составляется по номеру заявки),
перед фиксацией полезно обновить рабочую копию (или слить от ствола) и проверить предполагаемые изменения
("svn status" и "svn diff|less"), чтобы откатить случайный мусор (отладочная печать, изменения форматирования),
при фиксации изменений в комментарий включается номер заявки (для Trac - #номер),
длинный комментарий - повод для разбиения фиксации,
по завершении заявки выполняется тест регрессии,
при удачном прохождении теста изменения ветви сливаются в основной ствол,
после тяжелого слияния тест регресии необходимо повторить,
ветка удаляется.
При создании репозитория рекомендуется хранить каждый проект в отдельном каталоге верхнего уровня,
в котором завести подкаталоги trunk (основная линия разработки проекта),
branches (временные для экспериментов или постоянные для доработки поставляемых версий ветви проекта),
tags (поставляемые версии проекта), vendor (для чужих библиотек).
В противном случае, возникнут проблемы приложениями, расширяющими возможности subversion,
которые на это рассчитаны (subversion не отличает обычного копирования файла или каталога от создания ветви).
Можно иметь отдельный репозиторий на каждый проект, что увеличивает затраты на обслуживание,
усложняет обмен между проектами, но позволяет каждому проекту иметь индивидуальные настройки
(правила синхронизации, получатели извещений).
Поддерживаются следующие форматы хранения (backend, имеются средства конвертирования):
- Berkeley DB (BDB): BDB 4.4 имеет средства автовосстановления (требуются при аварийном отключении питания),
формат привязан к платформе, не стоит хранить в сетевой файловой системе
(требуются strict POSIX locking и mmap; запрещён одновременный доступ),
проблемы с авторизацией групп пользователей, занимает больше места, нет ограничений на количество ревизий,
встроенные транзакции, возможность резервного копирования без остановки работы
- FSFS (flat-file): устойчив к аварийным отключениям, не зависит от платформы, можно использовать в режиме "только чтение",
можно хранить в сетевой файловой системе, нет проблем с авторизацией групп пользователей (umask),
занимает меньше места, количество ревизий ограничивается максимальным числом файлов в каталоге
(каждая ревизия записывается в отдельный файл, атомарность транзакции обеспечивается переименованием файла),
возможность резервного копирования без остановки работы (каждая ревизия - это отдельный неизменяемый файл;
а как же связи между файлами - данные, метаданные, блокировки, HEAD, транзакции?)
Структура каталога:
- conf/ содержит конфигурационные файлы
- dav/ используется mod_dav_svn для хранения информации о текущей активности
- db/ содержит данные репозитория
- current - номер последней ревизии
- format
- fsfs.conf - настройки FSFS (enable-rep-sharing - управление дедупликацией)
- fs-type - формат хранения (fsfs или bdb)
- min-unpacked-rev
- revprops/ - метаданные ревизии в отдельном файле с соответствующим номером (текстовый формат)
- revs/ - каждая ревизия в отдельном файле с соответствующим номером;
в версии 1.5 можно размазать по подкаталогам; в версии 1.6 подкаталоги можно паковать
- transactions/ - временное хранение будущих ревизий (каталог на каждую транзакцию),
при аварийном завершении остаётся как мусор
- txn-current
- txn-current-lock
- txn-protorevs
- uuid - UUID
- write-lock
- format содержит номер версии структуры репозитория
- hooks/ содержит скрипты, модифицирующие поведение сервера;
каждый скрипт вызывается при наступлении определённого события;
бывают 2 типов: до события ('start-' и 'pre-', позволяют предотвратить его)
и после события ('post-', позволяют оповестить, кого следует);
при поставке заполнен шаблонами (к имени скрипта добавлен суффикс '.tmpl');
необходимы права на исполнение:
- start-commit
- pre-commit
- post-commit
- pre-revprop-change (запрещено по умолчанию)
- post-revprop-change
- pre-lock
- post-lock
- pre-unlock
- post-unlock
- locks/ содержит файлы блокировки, обеспечивающие атомарность изменений
Утилита svnadmin позволяет обслуживать репозиторий (только локальный доступ),
основные ключи:
- --bypass-hooks (обойти систему скриптов в hooks/)
- {--revision | -r} от[:до]
- --quiet | -q
- --config-dir каталог
Команды svnadmin:
- help [имя-команды]
- create [-fs-type fsfs | bdb] каталог # создание репозитория
- setlog каталог имя-файла-текста-комментария # изменить комментарий к ревизии
- setrevprop каталог имя-метаданных имя-файла-значения
- lslocks каталог # вывести список замков
- rmlocks каталог замок # удалить замок
- lstxns каталог # вывести список незавершённых транзакций
- rmtxns каталог номер-транзакции # удалить указанную незавершённую транзакцию
- pack каталог # упаковать отдельные файлы ревизий в большие группы, что ускоряет доступ и уменьшает (1%)
занятое место (с версии 1.6); остановка работы не требуется
- dump каталог [--incremental] [--deltas]
# вывести всю историю изменений на stdout в переносимом формате
- --incremental выводит даже первую выводимую ревизию в виде изменений
- --deltas выводит изменённые файлы в виде разности (несовместим с svndumpfilter)
- load каталог [--ignore-uuid] [--force-uuid] [--parent-dir ветвь-дерева]
# считать файл в переносимом формате с stdin в репозиторий
- --ignore-uuid - не брать UUID из потока
- --force-uuid - брать UUID из потока даже, если репозиторий был не пуст
- --parent-dir - позволяет "влить" содержимое частного репозитория в общий
- hotcopy каталог копия # создание резервной копии репозитория со всеми служебными файлами без остановки работы
- setuuid каталог [UUID]
- upgrade каталог
- verify каталог
Проверка целостности репозитория:
svnadmin dump --incremental -r0:HEAD репозиторий > /dev/null
Утилита svnlook позволяет проверять ревизии и транзакции (недоделанные ревизии),
не вносит изменений, используется скриптами (hooks) и для диагностики, только локальный доступ.
В качестве параметров указывается команда (help, youngest, info, changed, dirs-changed, author,
date, log, history, diff, lock, cat, tree, proplist, propget, uuid),
каталог и опции (--revision, --transaction, --verbose, --xml, --revprop).
Утилита svndumpfilter читает поток в переносимом формате с stdin,
вырезает из него относящиеся (или неотносящиеся) к указанному поддереву данные и записывает на stdout.
Первым параметром указывается команда: include или exclude.
Вторым параметром - поддерево. Следует обратить внимание на наличие или отсутствие
косой черты в начале имени - svnadmin dump её не выводит, а svndumpfilter выводит в отчёте.
Не переваривает переименования поддерева (см. svndumpfilter2).
Опции:
- --quiet | -q
- --targets имя-файла (считать поддеревья из файла)
- --drop-empty-revs (удалить ревизии, оказавшиеся в результате пустыми)
- --renumber-revs (перенумеровать ревизии после удаления)
- --preserve-revprops (если решили не удалять пустые ревизии, то оставить все метаданные в них)
Утилита svnsync позволяет на ходу копировать все изменения, вносимые в исходный репозитоорий,
в резервный репозиторий (с версии 1.5 можно синхронизировать поддерево).
Не требуются права записи в исходный репозиторий.
На время копирования желательно запретить прочие изменения в резервный репозиторий
(например, с помощью скриптов pre-revprop-change и start-commit).
Должно быть разрешено изменение метаданных для резервного репозитория (pre-revprop-change).
Для продолжения синхронизации после аварийного прерывания может потребоваться удалить метаданные
svn:sync-lock из ревизии 0.
Синхронизацию в реальном времени можно обеспечить с помощью скриптов post-commit и post-revprop-change
в исходном репозитории, запускающих svnsync.
Команды (общие опции: --config-dir, --source-username, --source-password, --sync-username, --sync-password,
--non-interactive, --trust-server-cert, --no-auth-cache, --quiet):
- help
- initialize URL-резервного-репозитория URL-исходного-репозитория
(подготовить девственно чистый резервный репозиторий с настроенным скриптом pre-revprop-change к грядущей синхронизации;
для изменения информации об исходном репозитории необходимо изменить метаданные svn:sync-from-url в ревизии 0)
- synchronize URL-резервного-репозитория (скопировать все накопившиеся ревизии с исходного репозитория в резервный)
- info URL-резервного-репозитория (показать информацию из метаданных svn:sync-*: URL-исходного-репозитория, UUID,
последняя скопированная ревизия)
- copy-revprops URL-резервного-репозитория [от[:до]] (скопировать метаданные указанных ревизий - они могли измениться)
Утилита fsfs-reshard.py перетряхивает файловую структуру db/ с целью ускорения доступа.
Для обмена между клиентом и сервером используется протокол WebDAV/DeltaV (http://).
Для шифрования можно использовать протокол SSL/TLS (https://).
Протокол HTTP без сохранения состояния (stateless) менее эффективен, чем протокол SVN.
Рекомендуется завести отдельного пользователя (svn) и приписать все файлы репозитория и процессы сервера ему.
Сервер Apache 2 (пакет httpd) должен загрузить модули mod_dav,
mod_dav_svn и mod_authz_svn (пакет mod_dav_svn):
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Описание репозитория (репозиториев):
<Location /svn>
DAV svn
SVNPath имя-каталога # права доступа должны соответствовать пользователю сервера Apache
# если в каталоге несколько репозиториев
# SVNParentPath имя-каталога
</Location /svn>
Доступ на чтение к последней ревизии репозитория доступен с помощью любого броузера
(для Firefox есть также расширение webdabfolder). Тип MIME извлекается из svn:mime-type (по умолчанию, text/plain)
или mount.davfs.
gvfs тоже смог бы, если бы не начал запрашивать родительский каталог.
Директива SVNReposName позволяет задать имя репозитория для заголовка.
Директива SVNListParentPath позволяет показывать
список репозиториев при использовании SVNParentPath.
Директива SVNIndexXSLT с указанием URI XSLT шаблона позволяет оформлять оглавления каталогов
(пример - tools/xslt/svnindex.xsl и svnindex.css, их необходимо положить в указанное место сайта - не в /svn!).
Директива SVNAutoversioning позволяет обычным WebDAV клиентам записывать
в репозиторий, при этом каждый раз создаётся новая ревизия (и не одна!).
Не стоит забывать об автосохранении, встроенном в обычные редакторы.
Директива ModMimeUsePathInfo позволяет автоматически задавать svn:mime-type.
Директива SVNAllowBulkUpdates позволяет запретить клиентам запрашивать информацию
об изменениях в виде одного огромного массива.
Аутентификация и авторизация пользователей производится средствами Apache,
с помощью модуля authz_svn_module, например (внутри Location):
# рекомендуется только под SSL/TLS
AuthType Basic
# имя области
AuthName "Subversion repository"
# заполняется утилитой "htpasswd -[c]m файл пользователь"
AuthUserFile /etc/httpd/conf/svn.htpasswd
# отключить проверку авторизации путей внутри запросов (ускоряет работу в 1.5 раза)
# SVNPathAuthz off
# описание прав доступа
AuthzSVNAccessFile /etc/httpd/conf/svn.access
# пускаем анонимусов
# Satisfy Any
# совсем не пускаем анонимусов
# AuthzSVNAnonymous Off
# ограничиваем любой доступ известными пользователями
# Require valid-user
# ограничиваем запись известными пользователями
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
Файл с описанием прав доступа имеет строчную структуру и делится на секции,
секция начинается с имени секции в квадратных скобках, комментарии начинаются с символа '#',
строка содержит имя параметра, символ '=' и значение.
Секция groups описывает принадлежность пользователей к группам.
Имя параметра задаёт имя группы, значение содержит список имён пользователей через запятую.
Секция aliases позволяется задавать синонимы пользователей (очень полезно для LDAP имён).
При использовании синонимов их необходимо предварять символом '&'.
Имена остальных секций задают каталог репозитория, для которого определяются права доступа
(до версии 1.7 символы в именах приводились к строчному регистру).
Если область HTTP сервера содержит несколько репозиториев (SVNParentPath), то имя репозитория
предваряет имя каталога (в качестве разделителя служит символ ":").
В данной секции в качестве имени параметра указывается имя пользователя или имя группы (предваряется
символом '@') или шаблон '*', в качестве значения - строки "r" (этому пользователю разрешено читать)
и "rw" (этому пользователю разрешено писать) или пусто (доступ запрещён).
Права доступа к подкаталогу наследуются от прав доступа к каталогу, дополнительные права доступа к подкаталогу
дополняют или перекрывают права доступа к каталогу.
Права доступа для группы не перекрываются индивидульными правами доступа, а объединяются
(нельзя отнять данные пользователю права с использованием групп).
Журнал svn (обычные запросы в этот журнал не попадут):
CustomLog logs/svn_logfile "%h %u %t %b \"%{User-Agent}i\" %v %{Host}i %{SVN-ACTION}e" env=SVN-ACTION
Имеется возможность репликации master-slave (с помощью mod_proxy).
Настройка SELinux:
chcon -R -t httpd_sys_content_t /data/svn
Для обмена между клиентом и сервером используется протокол SVN (TCP/3690, stateful, svn://), быстрее WebDAV.
Аутентификация и авторизация средствами SASL, соответственно возможен список пользователей, отличный от системного.
Авторизация с точностью до имени файла. Шифрование средствами SASL.
Рекомендуется завести отдельного пользователя (svn) и приписать все файлы репозитория и процессы сервера ему.
Конфигурационный файл определяется относительно указанного клиентом репозитория: conf/svnserve.conf.
Запускается как сервис или с помощью inetd (xinetd). Ключи:
- --help
- --daemon | -d (уйти в фоновый режим после запуска)
- --foreground (для отладки)
- {--root | -r} путь (имя репозитория отсчитывается относительно указанного корня)
- --inetd | -i (для запуска с помощью inetd, обслуживается одно обращение на stdin/stdout)
- --tunnel | -t (для запуска с помощью SSH, обслуживается одно обращение на stdin/stdout,
аутентификация считается выполненной (берётся из uid процесса))
- --tunnel-user имя-пользователя
- --read-only | -R
- --config-file имя-файла
- --listen-port порт
- --listen-host хост
- --log-file имя-файла
- --pid-file имя-файла
- --tunnel-user имя-пользователя
- --threads | -T (использовать потоки вместо процессов)
Конфигурационный файл имеет строчную структуру,
строка содержит имя параметра, символ '=' и значение, делится на секции,
секция начинается с имени секции в квадратных скобках, комментарии начинаются с символа '#', секции:
- general
- anon-access = {none | read | write} # права доступа для анонимных пользователей
- auth-access = {write | none | read} # права доступа для аутентифицированных пользователей
- password-db = имя-файла # если не используется SASL,
содержит секцию users по строке на каждого пользователя: имя = пароль
- authz-db = имя-файла # правила авторизации
- realm = имя-области-действи # по-умолчанию, UUID репозитория
- sasl
- use-sasl = {false | true} # настройки SASL в файле svn.conf в каталоге SASL
- min-encryption = 0 # 0 - отсутствие, 1 - контрольные суммы, больше - длина ключа шифрования (?)
- max-encryption = 256
В качестве первого позиционного параметра клиента командной строки svn указывается действие (команда).
Ключи могут использоваться в любом месте командной строки.
Общие ключи svn:
Команды svn (вместо имени файла можно использовать шаблоны в формате fnmatch):
- help [имя-команды]
- import [файл-или-каталог] URL-репозитория (импорт файла или содержимого каталога
в репозиторий без создания рабочей копии)
- export {имя-файла | URL} [каталог-приёмник] [--native-eol LF | CR | CRLF] (извлечь проект из репозитория или рабочей копии
без административных каталогов .svn)
- list [имя-файла | URL-репозитория] (посмотреть список файлов и каталогов в части репозитория)
- info {имя-файла | URL} (подробная информация об объекте рабочей копии или репозитория)
- blame {имя-файла | URL} (вывести автора и номер ревизии)
- checkout URL-репозитория [имя-каталога] (извлечь проект из репозитория в новую рабочую копию)
- cat {имя-файла | URL} (вывести содержимое на экран)
- update [URL-репозитория]
[--accept {postpone | base | mine-full | theirs-full | edit | launch}]
(обновить рабочую копию из репозитория; ключ --accept определяет метод разрешения конфликта при необходимости;
- флажки статуса
- в первой колонке:
- A - добавлен
- D - удалён
- U - обновлён
- C - конфликт
- G - слит
- во второй колонке выводятся флажки статуса метаданных
- информация о замках выводится в третьей колонке
- в случае конфликта (невозможности автоматического слияния изменений) предлагается меню действий:
- p - отложить разрешение конфликта;
сохранение в репозиторий невозможно до разрешения конфликта;
создаются файлы:
- имя-файла.mine - моя версия
- имя-файла.rСВЕРСИЯ - версия до моих изменений
- имя-файла.rНВЕРСИЯ - версия из репозитория
- имя-файла - слитая версия
- df - показать различия
- e - отредактировать файл в редакторе $EDITOR (конфликтная зона отмаркирована)
- r - принять слияние после редактирования
- mf - взять мою версию файла
- tf - принять их версию файла
- resolve --accept {base | mine-full | theirs-full | working} имя-файла
(определиться в чью пользу разрешить отложенный конфликт, временные файлы удаляются)
- add имя-файла-или-каталога [--depth empty] (запланировать добавление файла из рабочей копии в репозиторий
при следующем сохранении, ключ --depth управляет глубиной просмотра каталога)
- delete имя-файла-или-каталога [--keep-local] (запланировать удаление файла из репозитория при следующем сохранении,
удалить файл из рабочей копии, запланировать удаление каталога из рабочей копии)
- delete URL (удалить файл в репозитории немедленно; создаётся новая ревизия)
- copy имя-файла-или-каталога новый-файл
(скопировать файл и запланировать добавление нового файла из рабочей копии в репозиторий
при следующем сохранении)
- copy URL новый-URL (скопировать файл в репозиторий немедленно; также используется для создания ветвей;
хранится история происхождения; создаётся новая ревизия)
- copy имя-файла-или-каталога новый-URL (скопировать рабочую копию в репозиторий немедленно;
также используется для создания tags; создаётся новая ревизия)
- move имя-файла-или-каталога новый-файл
(запланировать добавление нового файла из рабочей копии в репозиторий и удаление старого
при следующем сохранении, т.е.это не переименование, а копирование и удаление,
так они и хранятся в истории, что вызывает изрядные
проблемы при слиянии;
не стоит включать переименование и изменение в одну фиксацию)
- move URL новый-URL (переместить файл в репозитории немедленно; только внутри одного репозитория)
- mkdir имя-каталога (создать каталог и запланировать его добавление в репозиторий
при следующем сохранении)
- mkdir URL (создать каталог в репозитории немедленно)
- status [имя-файла] [--show-updates | -u] [--no-ignore]
(выдать список измененных относительно извлечённых из репозитория файлов рабочей копии;
ключ --show-updates требует установления соединения с репозиторием;
колонки:
-
- ? - файл не контролируется
- ! - файл должен быть, а его нет
- ~ - неправильный тип объекта
- A - запланирован для добавления
- C - конфликт изменений
- D - запланирован для удаления
- M - изменён в рабочей копии
- R - заменён на файл с таким же именем
- I - игнорируется
- X - внешний объект
- флажки изменений метаданных: M - метаданные изменены, C - конфликт метаданных
- L - рабочая копия заблокирована локально
- + - запланировано добавление с историей
- S - переключён (см. switch)
- флажки замков:
- K - установлен наш замок в репозитории
- O - установлен чужой замок в репозитории (или в другой рабочей копии)
- B - наш замок сломан
- T - замок перехвачен
- конфликт дерева
- пробел
- * - в репозитории есть более свежая версия
- номер ревизии на момент извлечения
- номер ревизии на момент последнего изменения файла
- diff [имя-файла | URL] [--no-diff-deleted] [--diff-cmd имя-программы-diff] [--extensions опции-diff] [--notice-ancestry]
(выдать полный список изменений между рабочей копией и репозиторием в формате unified diff для patch)
- log [имя-файла | URL] [--use-merge-history | -g] [--limit число] (какие файлы менялись в каждой ревизии,
когда, кем и как он это комментировал)
- revert имя-файла-или-каталога (откатить изменения;
запланированные добавления файлов отменяются, но созданные файлы не удаляются)
- commit [--no-unlock] [--keep-changelists] [рабочая-копия]
(сохранить изменения; комментарий обязателен; завершится неудачно, если хотя бы один из сохраняемых
файлов был изменён в репозитории - необходимо обновиться, резрешить конфликты и попробовать ещё раз)
- cleanup [рабочая-копия] (накатить журнал изменений и сбросить блокировки рабочей копии)
- propset имя-свойства значение {имя-файла | --revprop [URL-корня]}
(установить свойство, требуется активированный скрипт pre-revprop-change;
ключ --revprop означает действие над метаданными ревизии)
- propedit имя-свойства {имя-файла | --revprop [URL-корня]} (редактировать свойство)
- proplist {имя-файла | --revprop [URL]} (выдать список свойств)
- propget имя-свойства {имя-файла | --revprop [URL-корня]} [--strict]
- propdel имя-свойства {имя-файла | --revprop [URL-корня]}
- lock [--force] имя-файла (создать замок; опция '--force' позволяет перевести существующий замок на себя)
- unlock [--force] {имя-файла | URL} (снять замок; опция '--force' позволяет ломать чужой замок)
- changelist метка [--remove] имя-файла ... (пометить файлы или снять пометку)
- merge [--ignore-ancestry] [--record-only] [--reintegrate] URL-начального-дерева URL-конечного-дерева приёмник
[--accept {postpone | base | mine-full | theirs-full | edit | launch}]
(вычислить разность между начальным и конечным деревом и применить её к приёмнику (рабочая копия);
запоминается какие ревизии уже слиты (в метаданных mergeinfo), чтобы при следующем вызове не сливать повторно;
при конфликте изменений выдаётся меню аналогично команде update и создаются файлы имя.working, имя.left, имя.right;
- --ignore-ancestry: не учитывать историю родственных отношений
- --record-only: не применять, но сделать запись об этом, используется для блокировки определённых изменений
и оживления возвращённой в ствол ветки)
- --reintegrate: указание, что производится слияние изменений из ветки в основной ствол
(по умолчанию сливаются изменеия из основного ствола в ветку)
- merge ^/trunk (слить ещё не слитые изменения основного ствола в рабочую копию текущей ветки;
рабочий каталог предварительно установить в ~/имя-ветки)
- merge ^/trunk (трюк: откатить изменения определённой ревизии и записать результат в рабочую копию;
необходимо указать номера ревизий от большего к меньшему)
- merge --reintegrate ^/branches/имя-ветки (включить изменения в ветке в рабочую копию основного ствола;
находиться в ~/trunk; ветвь становится непригодна для дальнейшей работы)
- mergeinfo [--show-revs merged | eligible] исходный-URL результат-URL
(показать накопленную информацию о слияниях)
- mergeinfo ^/trunk (показать список слитых ревизий)
- mergeinfo ^/trunk --show-revs eligible (показать список неслитых ревизий)
- switch URL (изменить привязку рабочей копии на другое поддерево репозитория; автоматически делается update)
- switch --relocate старый-URL новый-URL (переезд репозитория)
Локальные настройки хранятся в каталоге ~/.subversion (средний приоритет при выборе настроек,
создаётся при первом запуске клиента со значениями по умолчанию),
общие настройки в каталоге /etc/subversion (наименьший приоритет при выборе настроек) в обычном секционном формате:
- файл config
- секция auth
- store-passwords = yes | no # кешировать пароли
- store-auth-creds = no | yes # кешировать не только пароли, но и имена, сертификаты и т.д.
- секция helpers
- editor-cmd = имя программы редактирования текстов (также можно установить в переменных окружения
SVN_EDITOR, VISUAL, EDITOR)
- diff-cmd = имя программы сравнения
- diff3-cmd = имя программы трёхстороннего сравнения
- diff3-has-program-arg = true | false
- merge-tool-cmd = имя программы трёхстороннего слияния
- секция tunnels позволяет определить новые URL схемы
- секция miscellany
- global-ignores = список шаблонов имён файлов через пробел,
которые не надо обрабатывать командами status, add и import # по умолчанию - '*.o *.a ...'
- enable-auto-props = no | yes # автоматически добавлять метаданные (описываются в секции auto-props)
- log-encoding = кодировка добавляемых комментариев к действиям (хранится всегда в UTF-8)
- use-commit-times = no | yes # команды checkout и пр. будут устанавливать время последнего изменения
файлов в соответствии с данными репозитория
- mime-types-file = имя файла с описанием соответствия MIME типов именам файлов
- interactive-conflicts = yes | no # разрешать конфликты интерактивно
- no-unlock = no | yes # не освобождать замок при синхронизации
- секция auto-props позволяет задать соответствие между шаблонами имён файлов и список
устанавливаемых метаданных (имя=значение) через точку с запятой
- файл servers
- секция globals содержит общие настройки для всех серверов
- секция groups содержит соответствия между символическими именами серверов (имя параметра)
и их адресами (значение параметра, можно использовать имена хостов и шаблоны),
символические имена серверов используются как имена секций в этом файле
- секции с символическими именами серверов
- http-proxy-exceptions = список шаблонов имён хостов через запятую
- http-proxy-host = имя прокси сервера (HTTP)
- http-proxy-port = номер порта прокси
- http-proxy-username =
- http-proxy-password =
- http-compression = yes | no
- http-library = libsvn_ra_neon | libsvn_ra_serf # библиотека для WebDAV запросов,
libsvn_ra_serf - экспериментальная
- http-auth-types = список методов аутентификации через запятую: basic, digest, negotiate
- ssl-authority-files = список файлов сертификатов допустимых центров сертификации через запятую
- ssl-trust-default-ca = no | yes # доверять центрам сертификации, встроенным в OpenSSL
- ssl-client-cert-file = имя файла, содержащего клиентский сертификат (или ключ? или оба?)
- ssl-client-cert-password = пароль сертификата (совмещённого с сертификатом ключа?)
- store-plaintext-passwords = ask | yes | no # хранить пароль в кеше в открытом виде
- каталог auth хранит кеш аутентификации (права на чтение и запись только для владельца)
Пароли хранятся в каталоге ~/.subversion/auth в открытом виде!
Если при сборке svn при запуске configure был указан ключ --with-gnome=keyring,
то при запуске клиента svn будет сделана попытка обратиться к gnome-keyring-daemon
за хранящимся у него паролем (соответственно д.б. запущен полноценный Gnome и обеспечен доступ к нему).
Аккуратная настройка gnome-keyring авторы оставили пользователям в качестве домашнего задания.
Утилита svnversion выводит список ревизий рабочей копии.
svnkit - subversion, переписанный на Java.
VisualSVN Server - сборка под MS Windows.
Веб-интерфейс (модули и системы для apache):
- Система Trac имеет встроенные средства для просмотра и исследования репозиториев subversion
- WebSVN (пакет websvn, только посмотреть)
- SVN::Web (?)
- ViewSVN (?)
- mod_svn_view (?)
- Chora (?)
- SVN::RaWeb::Light (?)
- SVN Browser (?)
- Insurrection (?)
Автономные программы:
- Модуль Subclipse (пакеты eclipse-subclipse, eclipse-subclipse-book) для IDE Eclipse
- TortoiseSVN - графический клиент для MS Windows, встраивается в Windows Explore
- SmartSVN (Java, разработка компании Syntevo, бесплатная и коммерческая версии, может встраиваться в Windows Explorer)
- kdesvn - графический клиент для KDE
(пакет kdesvn для F10 и F12, версия 1.4.1 падает на русских именах файлов)
- RabbitVCS
(бывший nautilussvn) - графический клиент для Gnome,
встраивается в Nautilus
- RapidSVN - графический клиент для Linux
(wxWidgets, пакет rapidsvn для CentOS 5 и F10)
- VisualSVN - для Visual Studio
- viewvc (пакет viewvc, только посмотреть), ранее назывался ViewCVS
- eSvn (Qt?)
- subcommander (?)
- Jsvn
- psvn.el (emacs)
- qsvn (?)
- Versions - графический клиент для MacOS
meld - графический diff и merge для Gnome, пакет meld
(svndumpfilter не справляется с переименованием, желательно предварительно тестировать)
- остановить сервис
- cp -a путь-к-репозиторию копия
- su - svn
- ulimit -f ...
- svnadmin dump путь-к-репозиторию | svndumpfilter exclude каталог ... > копия-без-каталога
- rm -rf путь-к-репозиторию
- svnadmin create путь-к-репозиторию
- cat копия-без-каталога | svnadmin load путь-к-репозиторию
- упаковать, вернуть права доступа, запустить сервис и проверить
- удалить копию
Поиск "неправильных" файлов:
svn log -vq путь-к-репозиторию | egrep "^r|\.zip$" | grep -B 1 "\.zip$"
Поиск больших изменений:
for r in `svn log -q путь-к-репозиторию | grep ^r | cut -d ' ' -f 1 | tr -d r`
do
echo "revision $r is " `svn diff путь-к-репозиторию -c $r | wc -c` " bytes";
done
# какие файлы менялись
svn -v -c номер-версии log путь-к-репозиторию
От 1.5.2 до 1.6.5
- дедупликация файлов репозитория
- сокращённое обозначение ('^') корневого каталога репозитория в URL
- изменён алгоритм разрешения конфликтов файловой структуры
(переименование в репозитории изменяемого локально файла) - теперь требуется ручное вмешательство
- svn:external - не только каталоги, но и файлы
- упаковка файлов отдельных ревизий в большие группы ревизий
- доступ к конкретной ревизии через браузер
От 1.4.2 до 1.5.2
- полуавтоматическое отслеживание ветвлений и слияний
- интерактивное разрешение кофликтов
- частичный возврат (checkout)
- аутентификация SASL
- svn:external - относительные URL
- реализован механизм этикеток (tags) под названием changelists
- синхронизация поддерева
- синонимы имён пользователей
- сайт разработчиков subversion (Apache)
- сайт первых разработчиков subversion
- O'Reilly - Version Control with Subversion (версия 1.0)
- Управление версиями в Subversion
(открытая и дополненная версия книги Version Control with Subversion издательства O'Reilly,
английский вариант доведён до версии 1.5)
- Managing Software Development with Trac and Subversion, 2007, David J Murphy,
Packt Publishing (subversion 1.4.5, trac 0.10.4)
- Practical Subversion, Second Edition, 2006, Daniel Berlin and Garrett Rooney, APRESS (описывается версия 1.3)
- установка Subversion
- эффективность хранения двоичных файлов
(для скорости хранить сжатый tar-архив,
для уменьшения места использовать скрипт эффективного хранения для отдельных файлов,
любая аутентификация сильно замедляет работу)
- Subversion: чеклист по правильным коммитам
- Branching Patterns for Parallel Software Development
- svndumpfilter2 - svndumpfilter, переваривающий переименование проекта
- слияние ветвей в Eclipse (Subversive 0.7.7, SVN 1.4.4)
- Subversion Data Migration Features and Support (из CVS, PVCS, VSS, ClearCase, MKS, StarTeam)
- Subversion or CVS, Bazaar or Mercurial (перевод)
|
Bog BOS: subversion (svn) - система управления версиями
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru