Удаление файла из SubVersion/SmartSVN

Я использую SmartSVN в качестве внешнего интерфейса для Subversion. Иногда исходный файл, который находится под контролем репозитория, становится избыточным - он мне просто больше не нужен. В таком случае я хотел бы удалить его в том смысле, что обновление рабочей копии больше не приводит к извлечению файла из хранилища. Но я все еще хочу, чтобы история файла (то есть ранее зафиксированные ревизии) оставалась в хранилище.

Если я правильно помню, SmartSVN's Remove Команда удаляет историю файла (я, очевидно, не решаюсь это проверить). Пожалуйста, поправьте меня, если я ошибаюсь. В противном случае: Как мне достичь желаемого эффекта?

РЕДАКТИРОВАТЬ: Использование фиктивного файла, подтвердил, что Remove полностью удаляет файл из элемента управления SVN, и его история больше не отображается. Так что проблема реальна.

3 ответа

Решение

Subversion никогда полностью не удаляет файл из хранилища. На самом деле, это хорошо запрашиваемая функция.

Вы делаете svn delete или же svn rmи файл больше не находится в рабочей копии. Тем не менее, это определенно все еще там. Что, вероятно, убеждает вас, что файл был окончательно удален, так это то, что вы делаете что-то вроде этого:

 $ svn co http://repo/svn/project
 [...]
 $ cd project
 $ svn del foo.txt
 $ svn commit -m "Removed foo.txt"
 committed version 12345
 $ svn ls http://repo/svn/project/foo.txt
 No such file

Это правда. файл foo.txt больше не в самой последней редакции Subversion.

Может быть, вы сделали что-то вроде этого:

Вы знали, что файл не в редакции 12345, потому что вы удалили его. Тем не менее, давайте посмотрим на ревизию 12344. Файл все еще должен быть там в ТО ревизии:

 $ svn ls -r12344 http://repo/svn/project/foo.txt
 No such file

Посмотрите, ревизия не в ревизии 12344. Следовательно, она была окончательно удалена.

Не так быстро, Банки. Вы запросили версию 12344 файла в текущей версии макета хранилища. Что вам нужно сделать, это понять разницу между ревизией файла и ревизией репозитория. Это называется привязкой ревизии и может быть одной из самых сложных концепций в Subversion.

То, что вы хотите увидеть, - это файл в 12 344-й редакции хранилища. Для этого вы кладете @ в конце URL хранилища:

 $ svn ls http://repo/svn/project/foo.txt@12344
 foo.txt

Теперь мы можем увидеть файл, потому что он находится в 12 344-й ревизии этого макета хранилища. Если вам нужно восстановить файл, вы всегда можете скопировать версию файла, которую вы хотите, из размеченной версии макета хранилища:

 $ svn cp -r12344 -m"undeleting foo.txt" \
       http://repo/svn/project/foo.txt@12344 \
       http://repo/svn/project

Это скопирует версию 12344 файла foo.txt на 12 344-й ревизии хранилища до текущей ревизии хранилища.

Самый простой способ найти файлы, которые были удалены, это посмотреть на svn log:

 $ svn log -rHEAD -v http://repo/svn/project/foo.txt
 r12345 | dweintraub | [...]

 Removed foo.txt

 D  /project/foo.txt
 -----------------------------------------------------

Я удалил файл `foo.txt в ревизии 12345. Поэтому он все еще существовал в ревизии 12344. Полезно знать, нужно ли мне восстановить файл.

Да, в этом случае может показаться глупым, что я должен запросить ревизию файла и макет Subversion, потому что они оба одинаковы. Тем не менее, это не всегда будет так. Файлы перемещаются и копируются, удаляются и удаляются. Версия файла, которую я хочу, может отличаться от версии репозитория, которую я ищу.

В SmartSVN:

Выберите Файл / Папка -> щелкните правой кнопкой мыши -> "Открыть в браузере репозитория" -> щелкните правой кнопкой мыши файл / папку, которую хотите удалить -> "Удалить..."

Я принял ответ Дэвида У. - он правильно описал положение вещей с точки зрения Subversion (на основе командной строки). Поскольку я использую SmartSVN в качестве интерфейса GUI, я хотел бы добавить соответствующую информацию с этой точки зрения.

Чтобы просмотреть историю удаленных файлов с помощью SmartSVN,

  • Откройте браузер репозитория (в отличие от окна проекта)
  • Выпустить Repository | Show Revision команда
  • Выберите Revision переключатель; затем нажмите Select кнопка
  • Выберите ревизию репозитория, которую вы хотите увидеть

Затем вы увидите файл, при условии, что он присутствовал в выбранной вами версии репозитория.

Обратите внимание, что выбранная папка определяет, какие файлы отображаются (кажется, что нет способа отобразить все файлы, как в окне проекта), а также какие версии репозитория отображаются для выбора.

Другие вопросы по тегам