Блокирование

Как правило, Subversion работает лучше без блокировки, используя метод «Копирование-Изменение-Слияние», описанный ранее в «Модель Копирование-Изменение-Слияние». Однако, есть несколько случаев, когда вам может потребоваться реализовать в некотором виде политику блокирования.

Сначала вы должны убедиться, что ваш сервер Subversion обновлен до версии 1.2 как минимум. Более ранние версии вообще не поддерживали блокирования. Если вы используете доступ через file://, тогда, конечно, обновить потребуется только вашего клиента.

Три значения «Блокировки»

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

Второе — это блокировки рабочей копии, используемые внутренне Subversion для предотвращения коллизий между несколькими клиентами Subversion работающими с одной и той же рабочей копией. Обычно вы получаете эти блокировки когда команда, например, обновить/фиксировать/... прервана из-за ошибки. Эти блокировки могут быть удалены выполнением команды очистки в рабочей копии, как описано в «Очистка».

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

В общем случае вы можете забыть об этих видах блокировок пока не случится что-нибудь, что потребует вашего вмешательства. В этой книге «блокировка» означает первый вид, если обратное не указано явно или следует из контекста.

Как работает блокировка в Subversion

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

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

Важно

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

Например, представьте, что у пользователя Ивана есть рабочая копя на его офисном ПК. Там он начинает работать с изображением и поэтому делает блокировку этого файла. Когда он покидает свой офис он ещё не закончил работать с этим файлом, так что он не снимает эту блокировку. Дома у Ивана также есть рабочая копия, и он решает немного поработать над проектом. Но он не может изменить или фиксировать изменения в тот же самый файл, так как блокировка файла сделана в рабочей копии в офисе.

Однако, другие пользователи могут и не знать, что вы получили блокировку. Если только они не проверяют регулярно состояние блокировок, то впервые они узнают об этом только когда их фиксация закончится неуспешно, что в большинстве случаев не очень практично. Для того, чтобы проще управлять блокировками, существует новое свойство Subversion svn:needs-lock. Если это свойство установлено (в любое значение) у файла, то всякий раз, когда файл извлекается или обновляется, локальная копия помечается как "только-для-чтения", за исключением случая, когда эта рабочая копия заблокировала этот файл. Это служит предупреждением о том, что вы не должны редактировать этот файл, пока не получите блокировку. Версированные файлы только-для-чтения отображаются со специальной пометкой в TortoiseSVN для обозначения того, что вы должны получить блокировку перед началом редактирования.

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

Что делать, если кто-либо из ваших коллег установил блокировку и уехал в отпуск, не сняв её? Subversion предоставляет средство для преодоления блокировки. Снятие блокировки, установленной кем-либо ещё, известно как прерывание блокировки, а принудительный захват блокировки, установленной кем-либо другим, называется перехват блокировки. Естественно, вы не должны делать это необдуманно, если вы желаете остаться друзьями со своими коллегами.

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

Получение блокировки

Выберите файл(ы) в рабочей копии, которые вы желаете заблокировать, после чего выполните команду TortoiseSVNЗаблокировать....

Рисунок 4.57. Диалог блокировки

Диалог блокировки


Появится диалог, позволяющий ввести комментарий, чтобы другие могли увидеть, для чего вы заблокировали файлы. Комментарий необязателен, и сейчас используется только с хранилищами на базе Svnserve. Если (и только если) вам необходимо перехватить чужую блокировку, отметьте флажок Перехватить блокировку и нажмите ОК.

Вы можете установить свойство проекта tsvn:logtemplatelock чтобы предоставить пользователям шаблон сообщения для заполнения в качестве сообщения блокировки. Обратитесь к «Установки проекта» за инструкциями по установке свойств.

Если вы выберите папку и затем выполните TortoiseSVNЗаблокировать..., диалог блокирования будет открываться для каждого файла в каждой подпапке, выбранной для блокирования. Если вы действительно хотите заблокировать всю иерархию файлов, это можно сделать и таким способом, но вы можете стать очень непопулярным среди ваших коллег, если вы заблокируете таким образом целый проект. Так что используйте с осторожностью...

Снятие блокировки

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

Для снятия блокировки вручную, выберите файл(ы) в вашей рабочей копии, с которых вы желаете снять блокировку, затем выполните команду TortoiseSVNСнять блокировку. Больше ничего вводить не надо, TortoiseSVN свяжется с хранилищем и снимет блокировки. Вы можете также использовать эту команду на папке для рекурсивного снятия всех блокировок.

Проверка состояния блокировки

Рисунок 4.58. Диалог проверки на наличие изменений

Диалог проверки на наличие изменений


Чтобы посмотреть, какие блокировки были установлены вами и другими разработчиками, воспользуйтесь TortoiseSVNПроверить на наличие изменений. Установленные локально маркеры блокировки отображаются немедленно. Для проверки блокировок, установленных другими (а также для того, чтобы узнать, не были ли какие-либо из ваших блокировок прерваны или перехвачены), вам необходимо нажать на кнопку Проверить хранилище.

Здесь, используя контекстное меню, вы также можете устанавливать и снимать блокировки, помимо этого, можно также прерывать или перехватывать блокировки, установленные другими.

Избегайте прерывания и перехвата блокировок

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

Незаблокированные файлы, доступные только-для-чтения

Как уже говорилось, наиболее эффективный путь использования блокировки - это установка у файлов свойства svn:needs-lock. Чтобы узнать о том, как устанавливать свойства, прочтите «Установки проекта». Файлы, у которых установлено это свойство, при извлечении и обновлении получают признак "только-для-чтения", за исключением тех, блокировкой которых владеет ваша рабочая копия.

TortoiseSVN использует специальную пометку для обозначения этого в качестве напоминания.

Если у вас действует политика, при которой каждый файл должен быть заблокирован, то, возможно, будет легче применить возможность Subversion автоматически устанавливать свойства каждый раз, когда вы добавляете новые файлы (автосвойства). Для получения дополнительной информации прочтите «Автоматическая установка свойств».

Скрипты ловушек на события блокировки

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

Хорошей идеей является установить на сервере скрипты ловушек после-блокировки и после-разблокировки, которые будут отправлять электронное письмо с именем блокируемого файла. При наличии такого скрипта все ваши пользователи могут быть оповещены о том, что кто-либо блокирует/разблокирует файл. Вы можете найти пример скрипта ловушки hooks/post-lock.tmpl в папке вашего хранилища.

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

Прочтите «Скрипты ловушек, выполняемые на стороне сервера» для того, чтобы узнать об этом больше.