Как удалить файл из версий SVN, не удаляя его из каждой рабочей копии? - PullRequest
32 голосов
/ 27 октября 2009

Моя ситуация такова, что куча файлов проверяется в svn, что очень раздражает иметь контроль над исходным кодом (в частности, файл log4j.properties), и я хотел бы удалить их из контроля версий. Я уже знаю, как удалить файл из контроля версий SVN в моей собственной локальной рабочей копии, как в этот вопрос и этот , но это не совсем то, что я ищу.

Проблема в том, что, как только я удаляю файл с svn rm --keep-local, когда каждый второй пользователь извлекает из хранилища, его локальные копии log4j.properties исчезают, и их окружение падает. Я хочу удалить файл из системы управления версиями в хранилище, но также сделать так, чтобы, когда все остальные извлекали данные из хранилища, все было так, как если бы они использовали --keep-local на своих компьютерах, чтобы существующая копия их файла log4j.properties остается на месте, но становится неверсированным.

Это вообще возможно сделать? Я подозреваю, что это особенность, которой у svn просто нет.

Ответы [ 4 ]

14 голосов
/ 11 января 2010

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

Мы все еще используем SVN 1.4, поэтому опция --keep-local недоступна. Но вы можете добиться того же, удалив его, используя путь к серверу и сообщение -m commit.

Так что в моем примере я случайно зафиксировал каталог с именем nbproject. Вот где мы используем настройки проекта разработчика для IDE (NetBeans). Я не хотел удалять это из всех рабочих копий, иначе они потеряют все свои настройки! Но это помогло. Начиная с родительского каталога:

$ cd trunk
$ svn propedit svn:ignore .

вызывает $ РЕДАКТОР

добавить nbproject в отдельной строке и сохранить

$ svn commit -m 'Ignore nbproject'
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'
8 голосов
/ 27 октября 2009

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

Это нужно делать осторожно, когда пользователи явно не имеют доступа к хранилищу. Но он на самом деле удалит файлы (интересно, когда они большие) вместо того, чтобы хранить их в истории. Как побочный эффект, в следующий раз, когда пользователь выполнит обновление, эти файлы будут игнорироваться, как если бы они никогда не находились в хранилище. Мы должны были сделать это несколько раз, чтобы удалить двоичные файлы, для которых там не было своего места.

Ссылка на соответствующую документацию .

Простой пример (команда предлагает большую гибкость, конечно):

svnadmin create repos_new
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new

Поскольку это касается репозитория на сервере, я хочу еще раз подчеркнуть, что вы должны принять меры предосторожности (сохраните свой старый репозиторий). Для не очень надоедливых файлов метод, предложенный Don , менее радикальный и предпочтительный.

Чтобы избежать такой ситуации, вы можете установить соответствующие свойства svn:ignore в каталогах, вы также можете поощрять людей использовать глобальное игнорирование (они должны быть установлены на каждом клиенте, к сожалению) или даже использовать ловушку скрипты для упреждающего отклонения категорий файлов.

7 голосов
/ 27 октября 2009

В подобных ситуациях я обычно делаю переименование копии репозитория с log4j.properties на log4j.properties.template или log4j.properties.default и добавляю log4j.properties в список svn:ignore. Затем каждый пользователь должен скопировать этот файл в log4j.properties в своей рабочей копии. Чтобы сделать его немного более дружественным, вы можете поставить галочку в скрипте сборки, который выводит напоминание, если не находит локальную копию.

0 голосов
/ 22 июня 2012
svn delete --keep-local <PATH> 

сделает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...