Сен 30
SVN. Игнорирование файла, папки
Иногда бывает удобным установить игнорирование определенного файла в SVN, что бы на него не реагировали команды commit(ci) или update(up).Поясню.
Предположим у вас есть ноутбук, на котором домашняя версия разрабатываемого проекта, то есть свой конфигурационный файл(далее “конфиг”, который например лежит в папке application/), в котором хранятся настройки соединения с базой данных или путь к локальному smtp-серверу, в общем данные специфичные для работы в домашних(локальных) условиях.
Вы приходите с ноутбуком на работу и делаете коммит своих домашних настроек в общий репозиторий SVN, люди делают up и у них соответственно “грохается” соединение с базой и тому подобные интересные вещи. Участником такого обвала можете стать вы сами если тоже самое проделает ваш напарник, принеся свой конфиг в репозиторий. В принципе подменить пару строчек в файлике не проблема но, всё же, если это делать каждый день после апдейта - изрядно надоедает.
Выход из ситуации прост, SVN настолько крут, что позволяет игнорировать какие угодно вам файлы. Как это сделать вы можете прочитать в мануале по SVN на тему “svn propedit svn:ignore”, или по диагонали пробежаться по тексту, написанному мной ниже.
Что бы исключить файл config.ini, который в папке application из всех транзакций SVN’а, делаем нижеследующие шаги:
- Делаем копию подопытного файла у себя на винчестере, так как нам позже прийдется его восстанавливать;
- заходим по ssh в корневую папку вашего проекта;
- (опционально) исполняем команду svn st, что бы убедиться, что у нас нет незалитых изменений. Если такие есть, делаем svn ci;
- удаляем из SVN файл config.ini командой svn del - - force appication/config.ini ;
- делаем svn ci -m “config.ini R.I.P”;
- далее воспользуемся командой svn propedit svn:ignore application/ . Команда svn propedit редактирует свойство (property edit), svn:ignore собственно имя свойства, application/ имя папки, на которую распространяется это свойство;
- В открывшемся редакторе vi, необходимо вписать имя файла в папке application/ в нашем случае config.ini или вместо имени файла написать маску, например *.ini;
- Далее 2 раза ESC, затем “Shift+:” и “wq!”;
- Следующим шагом делаем svn ci -m “application/config.ini ignored”;
- Далее нам нужно восстановить файл config.ini в папочку application/ (файлик берем оттуда, куда мы его положили в п.1);
- после чего добавляем этот файл в SVN командой svn add application/config.ini;
- делаем svn ci -m “WOW! Config.ini! OMG! O_o”.
Если вдруг в процессе выполнения вышеописанных шагов система пишет что-то типа
1 2 3 4 | Sending application svn: Commit failed (details follow): svn: Your file or directory '.' is probably out-of-date svn: The version resource does not correspond to the resource within the transaction. Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit). |
не разочаровуйтесь, делайте svn up и её должно попустить.
Если вы чего-то не так сделали, в любой момент можно удалить свойство svn с помощью команды
svn propdel svn:ignore application/ и начать всё сначала
6 комментариев на данный момент
Оставить комментарий
О спасибо, за подробное описание, как раз столкнулся с этой проблемой
Спасибо, vtmn. Инфа очень реально помогла (:
Правда с vi какая-то запара, он открывался по 2 раза, причем последний раз для текущего каталога. Но в целом, все получилось.
>> 11. после чего добавляем этот файл в SVN командой svn add application/config.ini;
как оказалось, эта затея не самая лучшая
после добавления СВН не стал игнорировать файл, а снова его мержил…
после общения с комрадом джоссером, я понял, что суть svn:ignore сделать файл (папку) невидимым, например, для svn st…
поэтому проблему я решил, пройдясь по пунктам описанным в данном посте, но после 10-го сделал копию файла config.ini в config.ini.bak, добавил его (бак) в свн и закомитился
теперь если нужно залить сайт на новый хост, переименовываю config.ini.bak в config.ini и все ок… config.ini is ignored ^_^
Arigato за разъяснения.
Еще бы хотелось добавить, что руководствуясь данным маном не получится заигнорить файлы из корневого каталога проекта.
Сейчас как раз ковыряю документацию SVN по этому поводу, ибо не получилось…
Этот способ хорош, если речь идет об одном-двух файлах. Более того, опасность кроется в том, что у других участников проекта (разработчиков) config.ini - при update просто сотрется. Я никак не могу найти способ удалить файл из репозитария без влияния на локальные версии разработчиков (которые, не обязательно ci используют - тестеры могут только update) с различными, конечно, файлами config.ini.
Единственный метод такой операции я нашел тут: http://www.daken.ru/articles/delete-files-from-svn.xhtml . Суть метода в том, чтобы dump’ить базу svn, “цедить” ее с применением фильтра, и перезалитие на прежнее место. Но это жутко муторно! Народ! Поможите… а.
Отличное описание. Поскольку постоянно забываю, как ставить в игнор файлы и папки, то приходится освежать память по svn –help. А тут как раз попался хороший мануал, сохраняю к себе в папку lib.
Кстати, по этому мануалу облично удалось заигнорить целую папку в корне проекта