Как «восстановить» удаленную папку в 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