Подтвердить что ты не робот

Как удалить файл из версии svn, не удаляя его из каждой рабочей копии?

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

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

Можно ли это сделать? Я подозреваю, что это функция, которую svn просто не имеет.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

$ cd trunk
$ svn propedit svn:ignore .

выводит $EDITOR

добавить nbproject в свою собственную строку и сохранить

$ svn commit -m 'Ignore nbproject'
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'

Ответ 3

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

Ответ 4

svn delete --keep-local <PATH> 

сделает