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

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

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

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

9 ответов

Решение

Используйте 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 -> Объединить...
  • в разделе От введите ревизию, которая сделала удаление
  • в разделе Кому введите ревизию перед удалением.
  • Нажмите "объединить"
  • совершить

Хитрость заключается в том, чтобы слиться в обратном направлении. Слава Шону. За то, что указал мне правильное направление!


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

С черепахой SVN:

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

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

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

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

Другие вопросы по тегам