Как «восстановить» удаленную папку в Subversion / TortoiseSVN?


96

Мы случайно удалили папку «теги» из нашего репозитория Subversion, где намеревались удалить только один конкретный тег. Как проще всего вернуть папку «Теги»?

Мы используем TortoiseSVN в качестве нашего клиента, и я подумал, что когда я перейду в браузер репо и покажу журнал, будет что-то вроде «отменить изменения из этой ревизии», аналогично тому, что вы можете увидеть в аналогичном диалоговом окне в вашей рабочей копии. Но такой команды там нет ...

Ответы:


115

Просто скопируйте удаленную папку из более ранней версии.

В обозревателе репозитория нажмите кнопку с надписью HEAD (в правом верхнем углу), чтобы показать ревизии, в которой ваша папка все еще существует, затем щелкните эту папку правой кнопкой мыши и выберите «Копировать в ...» и введите путь туда, где вы хотите, чтобы папка была создана заново (вероятно, тот же путь, который уже указан в текстовом поле).


4
Отличный совет, спасибо. Одна ошибка TortoiseSVN - в этом диалоговом окне «Копировать в ...» мне пришлось изменить путь с «example.com/svn/tags» на «tags1», а затем обратно, чтобы кнопка OK стала активной.
— Борек Бернард

2
Это может быть хорошо для тегов, но не должно выполняться для восстановления любой другой папки, так как вы потеряете историю
— slckin

3
Он хранит историю, просто сделал это тоже.
— acdcjunior 05

просто убедитесь, что вы сняли флажок «Остановить при копировании / переименовании» при просмотре журнала, потому что иначе TortoiseSVN не будет отображать историю до вашего действия по восстановлению (очевидно) ...
— Оли

Это полностью сработало. Сэкономил много времени. Спасибо :)
— dgupta3091 09

78

для энтузиастов командной строки:

  • сначала найдите номер редакции, в которой произошло ваше удаление:

    svn log -v http://svnserver/path/to/folderContainingDeletedFolder
    

скажем, вы обнаружили, что каталог был удален в версии 999 (кстати: вам может быть проще найти номер версии с помощью браузера репозитория svn)

  • копируем папку ревизии минус 1

    svn copy http://svnserver/path/to/folderContainingDeletedFolder/deletedFolder@998 http://svnserver/path/to/folderContainingDeletedFolder/deletedFolder -m "undeleted folder"
    

вуаля, готово!

в вашем случае это может быть:

    svn copy http://svnserver/project/tags@998 http://svnserver/project/tags -m "undeleted folder"

1
Спасибо .. сэкономили много времени
— Дхарани Кумар

Это только что спасло мой бекон!
— axiopisty

Просто хотел подтвердить, что подход «svn copy» действительно сохраняет всю историю, а для папок он работает рекурсивно, восстанавливая папку и всех дочерних элементов.
— WallStProg

11

Большинство из этих ответов в какой-то степени будут работать, но правильный ответ - Даниил. Сделайте обратное слияние. Таким образом вы сохраните историю версий.

svn merge -r R1:R2

где R1 - это ревизия, в которой вы находитесь, а R2 - ревизия, содержащая удаленный файл / папку.


1
При обратном слиянии R1 должна быть ревизией, которую вы хотите отменить, а R2 - ревизией до этого.
— arleslie

2
Вы не потеряете историю с svn copy.
— maxschlepzig

Для тех из нас, кто не является энтузиастом командной строки, см .: tortoisesvn.net/docs/nightly/TortoiseSVN_en/…
— Паскаль

2
Разве это не восстановит все удаленные файлы / папки? Сработает ли это, если я хочу восстановить только одну конкретную удаленную папку, но не другие удаленные папки?
— OJ7

8

Вам нужно будет выполнить обратное слияние .

Подробную информацию о том, как это сделать (и почти обо всем, что вам когда-либо понадобится или понадобится делать с SVN), можно найти в официальной книге в Интернете .


3

Следуя ответу Рауди, который работал у меня после этой ревизии.

Некоторым клиентам svn может потребоваться номер версии, указанный с помощью параметра -r revision вместо использования @ после папки, как показано ниже:

svn copy svn://svnserver/project/tags svn://svnserver/project/tags **-r 998** -m "undeleted folder"

Если вы выполняете восстановление из папки, которая все еще существует, то все -r <revision>будет работать. Однако, если вы пытаетесь восстановить папку напрямую, вам нужно будет использовать @<revision>. В противном случае он сообщит, что файл не найден.
— arleslie

2

Перейти Repository Browserк своему repository, щелкните правой кнопкой мыши родительскую папку, в которой существовала удаленная папка . Теперь Show Logиз родительской папки выберите предыдущую ревизию, в которой вы зафиксировали операцию удаления. У вас будет список, щелкните правой кнопкой мыши папку в информации о версии и выберите Update to this Revision.

Вы сделали


О, я вижу, это было не в диалоговом окне «Показать журнал», а в главном окне браузера репо. Тем не менее, эта команда попытается обновить мою локальную рабочую копию, в то время как я хотел бы исправить эту проблему на сервере напрямую (вы можете себе представить, что проверка сотен тегов, каждый из которых содержит тысячи файлов, не совсем то, что мне нужно. делать).
— Борек Бернард

У меня это сработало. Параметр контекстного меню (при щелчке правой кнопкой мыши) - «Отменить изменения из этой ревизии», и он отменяет объединение изменений.
— hsg 02
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.