Как удалить файл из системы контроля версий, не удаляя его?


132

Если я запускаю svn rm file, файл удаляется из локальной рабочей копии.

Что я сейчас делаю:

$ cp file file2
$ svn rm file
$ svn ci
$ mv file2 file

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


Ответы:


277

Вам нужен параметр --keep-localкомандной строки. Это удаляет файл из системы контроля версий, не удаляя его из файловой системы.

$ svn rm --keep-local my_important_file

Примечание:--keep-local только влияет на svn rmвашу копию. У других пользователей может быть удалена их собственная локальная копия файла, если между их локальной копией и репозиторием не возникает конфликта из-за внесенных ими изменений. Возможно, это не желаемый результат. См. Комментарии ниже.


4
Разве это не удалит его из систем других людей после обновления?
— Nyerguds

1
@Nyerguds Это верно, поскольку svn rm удаляет файлы из репозитория. Если вы хотите удалить файлы из репо, НО храните их локально на своем компьютере, тогда вы должны использовать флаг выше.
— Грег Хилстон

6
@GregHilston Однако, как я уже сказал, это не очень помогает в реальных проектах с несколькими программистами. Должен быть способ просто деверсировать файл везде. Наиболее частым случаем здесь является случайная фиксация файлов локальных настроек (очень часто в проектах Java), но их деверсия не должна стирать файлы настроек других пользователей.
— Nyerguds

5
@GregHilston «настоящие проекты с несколькими программистами» скорее подразумевались в «чужих системах». Проблема в следующем: другие люди обновляют и перезаписывают свои настройки. Обычно это не слишком проблематично, но достаточно раздражает, чтобы захотеть решить эту проблему. Но в тот момент, когда они уже перезаписали настройки и теперь получают svn "rm" при обновлении, он фактически удаляет потенциально жизненно важный файл локальных настроек из своей системы, в то время как его нужно просто не версировать, чтобы его можно было настроить на локальный настройки снова.
— Nyerguds

4
При повторной загрузке более старого файла из репозитория он помечается как принадлежащий к этой более старой версии, то есть при обновлении он просто удаляется снова. Нет чистого способа сделать это, не требующего ручного вмешательства на всех машинах в проекте.
— Nyerguds

13

Удаление файла из SVN без его локального удаления нигде не является распространенной проблемой. Ярким примером является файл .classpath в проекте Eclipse. Помещение этого файла конфигурации в SVN - это замечательно, если все машины, используемые в проекте, имеют одинаковую установку Eclipse и Java. Как только это условие нарушается, коммиты начинают нарушать работу других проектов Eclipse. Это тот момент, когда нужно удалить файл из SVN, не удаляя его нигде.

svn rm --keep-local .classpath

отлично выполняет свою работу на одной машине и в данный момент времени.

Проблема в том, что другие машины могут потерять этот файл (при обновлении) или воскресить его (при фиксации). Недостаток SVN не в том, чтобы обрабатывать его --keep-localв репозитории или распространять его на другие рабочие копии. Следовательно, на всех других машинах необходимо выполнить указанную выше команду - лучше всего перед фиксацией или обновлением.

Это, конечно, сработает в лучшем случае на 90%. Удаление и изменение версии произойдут внезапно. Мое решение - сделать так, чтобы каждая машина, к которой у меня есть прямой или косвенный доступ,

svn rm --keep-local .classpath
copy .classpath .classpath-nameOfTheMachine
svn add .classpath-nameOfTheMachine

Это настолько отвратительно, что вряд ли можно назвать «решением». Тем не менее, это всегда позволяло быстро устранить любые более поздние аварии.


-3

У меня нет ответа на этот точный вопрос, но у меня есть ответ на связанный с ним вопрос, а именно, как удалить все файлы (т.е. не конкретный) в каталоге из системы контроля версий, не удаляя их локально. Это решение взято из реализации Scientific Linux.

ls -a .svn

должен показать каталог svn, в котором хранятся управляющие данные. Просто:

rm -r .svn

избавится от этого каталога. Затем введите:

svn status

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

Надеюсь, это поможет.


Связанный вопрос? ИМХО, удаление файла и удаление всей рабочей копии - это разные вещи.
— Melebius
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.