понедельник, 12 декабря 2011 г.

SVN: некоторые особенности

Тэги

В свн тэг - это не метка на определённую ревизию, а самый обычный бранч, который делается через svn copy. Об этом надо помнить, особенно после работы с другими системами, где термины схожи, но суть разная.
Это означает некоторые особенности в работе:
1) Метки можно менять. И меняться они будут независимо от бранча. Считается неправильным, но часто применяется "пофиксить прямо сейчас";
2) Можно сделать багофикс в метке и влить его в транк;
3) если права доступа установлены индивидуально для директорий, то метка эти права не наследует;
4) трудно узнать, в какие метки вошёл файл (то же для директории);
5) если из метки создать рабочую копию и зафиксировать из этой рабочей копии какие-либо изменения, то это изменит саму метку, а не те данные, которые были помечены. Правильным способом работы «от метки» является создание рабочей копии не из метки, а из того, что является источником этой метки.

Часть информации скопирована из вики

Свойства

Такое впечатление, что свойства появились сильно позднее - работа с ними через костыли. Поиска по свойствам нет, фильтров нет, вывод свойств svn proplist - только на отдельные объекты. Штатно не сделать вывод всех директорий, для которых установлен svn:ignore, со значениями.

На самом деле со свойствами много непоняток.
Крайне неудобно, что нельзя задать в маски строки вида */*/*links.db - оно просто не работает.
svn status verbose не показывает изменения атрибутов. Точнее, М покажет, но изменился сам файл или ему поменяли какое-то свойство - непонятно.
Установка svn:executable и некоторых подобных меток нелогична, и в оф доке ни намёка как правильно делать. Суть в том, что должно быть 3 аргумента, а у нас есть только 2: имя свойства, значение свойства, файл. А какое тут значение? А любое: ON, yes, 1... Так что писать так:
svn propset svn:executable yes /path/to/file. И ещё момент: этот бит не выставляется на каталоги, только на файлы.
!!! Если делаем svn propset svn:ignore -- тут надо внимательнее вписывать первый аргумент, потому что написав "svn propset svn:ignore ON tmp/" в игнор будет записан ON, поэтому надо вписывать \* (со слэшем, чтобы шелл не перехватил)

Особенности с операциями
Добавление файлов и каталогов. Сделав svn add dir/ добавит не только этот каталог, но и всё в нём. Чтобы добавить только его (например, чтобы проставить игнор), добавлять надо так: svn add -N dir/ . Если же было по ошибке добавлено без -N, снять добавление (до коммита) можно через svn revert dir, это не тронет его содержимое, но снимет метку добавления. Но если что-то внутри локально было исправлено - тоже откатит, поэтому надо быть аккуратным и revert-ить только лишнее. Или заранее сделав бэкап, и если что-то откатило - вернуть потом на место. А вот если уже так и закоммитили -- можно сделать svn up -r xxx (на предыдущую), а потом как-то зафиксировать так.. но проще скопировать, сделать svn rm dir, коммит и вернуть файлы на место (rm их удалит при коммите). В общем, тут красивого решения не знаю. Реверта на конкретную версию нет.

Частичный коммит. Можно сделать svn ci subdir/ - это закоммитит только изменения в subdir, не затронув изменения выше.
Но также можно сделать svn up subdir - это обновит тоже только subdir, что может быть чревато - если менялось много файлов, у нас получится часть файлов ревизии 1, часть ревизии 2.. Привет странные ошибки.

Простое создание ветки
svn copy ^/trunk ^/branches/branch_name

"Да и никто не мешает сделать скрипт, наподобии:
svn copy ^/trunk ^/branches/%1

И вызывать его:
svn_branch НАЗВАНИЕ_ВЕТКИ"
отсюда

Стратегии использования svn

Для работы на svn-сервере есть команда svnlook, ей в частности можно посмотреть содержимое репы, информацию о ревизии итд.
svnlook info /path/to/repo - информация о последнем коммите
svnlook tree /path/to/repo - список файлов

Плюс для работы нужна утилита svnadmin
создание репы, проверка, дамп-рестор

И есть малоизвестная команда svnsync - создание зеркала реп

Комментариев нет:

Отправить комментарий