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

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

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

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

cjames
источник
Связанный вопрос? ИМХО, удаление файла и удаление всей рабочей копии - это разные вещи.
Melebius