Как правильно восстановить удаленный файл из SVN? - PullRequest
107 голосов
/ 29 января 2009

Я удалил файл из репозитория и теперь хочу его вернуть. Лучшее, что я могу понять, это:

  • обновление до ревизии перед удалением
  • скопировать файлы в другое место
  • обновление до головы
  • скопировать файлы обратно
  • добавить их
  • совершить

Это просто плохо пахнет и теряет всю историю при загрузке Должен быть лучший способ сделать это. Я уже заглянул в Книгу SVN , но ничего не нашел и сейчас просматриваю список тегов SVN.

Ответы [ 9 ]

164 голосов
/ 05 августа 2009

Проблема с выполнением svn-слияния, предложенная Шоном Брайтом, заключается в том, что она вводит другие изменения, внесенные в ту же ревизию, что и удаление. Копирование svn - это более целенаправленная операция, которая влияет только на удаленные файлы.

Используя Tortoise SVN, вы можете воскресить файл, который был удален из вашего каталога рабочей копии и из более поздних версий SVN, с помощью svn-копии следующим образом:

  • Перейдите в папку с рабочей копией, в которой ранее находился файл.
  • Щелкните правой кнопкой мыши папку в проводнике, перейдите в TortoiseSVN -> Показать журнал.
  • Щелкните правой кнопкой мыши номер ревизии непосредственно перед ревизией, которая удалила файл, и выберите «Обзор репозитория».
  • Щелкните правой кнопкой мыши по удаленному файлу, выберите «Копировать в рабочую копию ...» и сохраните.

Удаленный файл теперь будет в папке с рабочей копией. Чтобы снова добавить его в SVN, щелкните правой кнопкой мыши на восстановленном файле и выберите SVN Commit.

NB. Этот метод сохраняет предыдущую историю восстановленного файла, однако для просмотра предыдущей истории в журнале TortoiseSVN необходимо убедиться, что «Остановить копирование / переименование» не отмечено в диалоговом окне «Сообщения журнала».

53 голосов
/ 29 января 2009

Использовать SVN Merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Итак, пример:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Для TortoiseSVN (я думаю ...)

  • Щелкните правой кнопкой мыши в Проводнике, перейдите в TortoiseSVN -> Объединить ...
  • Убедитесь, что выбрано «Объединить диапазон ревизий», нажмите «Далее»
  • В текстовом поле «Диапазон редакций для слияния» укажите редакцию, которая удалила файл
  • Установите флажок «Обратное слияние», нажмите «Далее»
  • Нажмите Объединить

Однако это совершенно не проверено.


Под редакцией OP : Это работает на моей версии TortoiseSVN (старая версия без следующей кнопки)

  • Перейдите в папку, из которой был удален материал
  • Щелкните правой кнопкой мыши в Проводнике, перейдите в TortoiseSVN -> Объединить ...
  • в разделе From введите ревизию, которая произвела удаление
  • в разделе К введите ревизию перед удалением.
  • Нажмите «объединить»
  • 1043 * совершить *

Хитрость в том, чтобы объединить назад . Слава sean.bright за указание мне в правильном направлении!


Редактировать: Мы используем разные версии. Метод, который я описал, прекрасно работал с моей версией TortoiseSVN.

Также следует отметить, что если в коммите было несколько изменений, с которыми вы выполняете обратное слияние, вы захотите отменить эти другие изменения, как только слияние будет выполнено до фиксации. Если вы этого не сделаете, эти дополнительные изменения также будут отменены.

26 голосов
/ 29 января 2009

Для полноты, это то, что вы нашли бы в книге SVN, если бы вы знали, что искать. Это то, что вы уже обнаружили:

Отмена изменений

Воскрешение удаленных предметов

То же самое из более поздней (и подробной) версии книги:

Отмена изменений

Воскрешение удаленных предметов

16 голосов
/ 12 октября 2010

Используйте функцию копирования SVN Tortoise, чтобы отменить внесенные изменения:

  1. Щелкните правой кнопкой мыши родительскую папку, содержащую удаленные файлы / папку
  2. Выберите «Показать журнал»
  3. Выберите и щелкните правой кнопкой мыши версию, до которой были внесены изменения / удалено
  4. Выберите «Обзор хранилища»
  5. Выберите файл / папку, которую необходимо восстановить, и щелкните правой кнопкой мыши
  6. Выберите «копировать в», чтобы скопировать файлы / папки в заголовок ревизии

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

11 голосов
/ 17 сентября 2012

Кажется, я всегда использую svn copy в качестве серверной операции, поэтому не уверен, что она работает с двумя рабочими путями.

Вот пример восстановления удаленного файла в локальную рабочую копию проекта:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Находясь внутри директории проекта. Это также работает для восстановления целых каталогов.

5 голосов
/ 29 января 2009

Если вы используете Tortoise SVN, вы должны иметь возможность вернуть изменения только из этой ревизии в вашу рабочую копию (эффективно выполняя обратное слияние), а затем сделать еще один коммит для повторного добавления файла. Шаги для подражания:

  1. Перейдите в папку в рабочей копии, где вы удалили файл.
  2. Перейти в репо-браузер.
  3. Перейдите к версии, в которой вы удалили файл.
  4. В списке изменений найдите удаленный файл.
  5. Щелкните правой кнопкой мыши файл и перейдите к «Отменить изменения из этой ревизии».
  6. Это восстановит файл в вашу рабочую копию, сохраняя историю.
  7. Зафиксируйте файл, чтобы добавить его обратно в хранилище.
4 голосов
/ 10 сентября 2009

Самый простой способ, которым я смог восстановить файлы и не потерять историю изменений, это использовать SVN copy , приведенный выше пример слияния кажется мне более сложным способом достижения того же самого. Почему необходимо слить, если вы просто хотите восстановить ревизию?

В этом случае я использую следующее, и оно работает довольно хорошо.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Кажется, я всегда использую svn copy в качестве серверной операции, поэтому не уверен, что она работает с двумя рабочими путями.

4 голосов
/ 29 января 2009

С Черепаха СВН :

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

Если вы уже зафиксировали удаленный файл, вы можете использовать обозреватель хранилища, перейти к ревизии, в которой файл еще существовал, и затем использовать команду Копировать в ... из контекстного меню. Введите путь к вашей рабочей копии в качестве цели, и удаленный файл будет скопирован из хранилища в вашу рабочую копию.

0 голосов
/ 29 января 2009

Вы должны иметь возможность просто проверить один файл, который вы хотите восстановить. Попробуйте что-то вроде svn co svn://your_repos/path/to/file/you/want/to/restore@rev, где rev - последняя ревизия, в которой существовал файл.

Некоторое время назад мне пришлось сделать именно это, и, если я правильно помню, использование опции -r для svn не сработало; Мне пришлось использовать синтаксис :rev. (Хотя я мог бы вспомнить это задом наперед ...)

...