Удаление файла из 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
кнопка - Выберите ревизию репозитория, которую вы хотите увидеть
Затем вы увидите файл, при условии, что он присутствовал в выбранной вами версии репозитория.
Обратите внимание, что выбранная папка определяет, какие файлы отображаются (кажется, что нет способа отобразить все файлы, как в окне проекта), а также какие версии репозитория отображаются для выбора.