Каков правильный способ восстановления удаленного файла из SVN?

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

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

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

Ответ 1

Использовать 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 → Merge...
  • Убедитесь, что выбрано "Слить диапазон исправлений", нажмите "Далее"
  • В текстовом поле "Диапазон изменения для слияния" укажите версию, которая удалила файл
  • Установите флажок "Обратное слияние", нажмите "Далее"
  • Нажмите "Объединить"

Это полностью непроверено.


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

  • Перейдите в папку, которая была отлажена
  • Щелкните правой кнопкой мыши в проводнике, перейдите в TortoiseSVN → Merge...
  • в разделе От введите ревизию, которая удалила
  • в разделе Кому введите ревизию перед удалением.
  • Нажмите "merge"
  • совершить

Трюк состоит в том, чтобы объединиться назад. Престижность sean.bright для указания меня в правильном направлении!


Изменить: Мы используем разные версии. Описанный мной метод отлично работал с моей версией TortoiseSVN.

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

Ответ 2

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

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

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

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

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

Ответ 4

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

  • Щелкните правой кнопкой мыши родительскую папку, содержащую удаленные файлы/папку
  • Выберите "журнал показа"
  • Выберите и щелкните правой кнопкой мыши на версии, перед которой были сделаны изменения/удалены.
  • Выберите "просмотр репозитория"
  • Выберите файл/папку, которую необходимо восстановить, и щелкните правой кнопкой мыши
  • Выберите "copy to", который скопирует файлы/папки в версию главы.

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

Ответ 5

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

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

svn copy https://repos/project/modules/[email protected] modules/module.js

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

Ответ 6

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

  • Найдите папку в рабочей копии, где вы удалили файл.
  • Перейдите в репозиторий-браузер.
  • Перейдите к версии, в которой вы удалили файл.
  • В списке изменений найдите файл, который вы удалили.
  • Щелкните правой кнопкой мыши файл и перейдите к разделу "Отменить изменения из этой версии".
  • Это приведет к восстановлению файла в вашей рабочей копии, сохраняя историю.
  • Зафиксируйте файл, чтобы добавить его обратно в ваш репозиторий.

Ответ 7

С Tortoise SVN:

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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