Как удалить файл из версии svn, не удаляя его из каждой рабочей копии?
Моя ситуация заключается в том, что куча файлов проверяется на svn, которые очень раздражают, когда они находятся под контролем источника (в частности, файл log4j.properties
), и я хотел бы удалить их из управления версиями. Я уже знаю, как удалить файл из svn управления версиями в моей локальной рабочей копии, как в этот вопрос и этот, но это не совсем то, что я ищу.
Проблема заключается в том, что как только я удалю файл с помощью svn rm --keep-local
, когда каждый другой пользователь вытащит из репозитория, их локальные копии log4j.properties
исчезнут, а их среды будут разбиваться. То, что я хочу сделать, это удалить файл из управления версиями в репозитории, но также сделать так, чтобы, когда все остальные вытаскивают из репозитория, они будут, как если бы они использовали --keep-local
на своих собственных машинах, так что существующая копия их файла log4j.properties
склеивается, но становится неверсифицированным.
Можно ли это сделать? Я подозреваю, что это функция, которую svn просто не имеет.
Ответы
Ответ 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>
сделает