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

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

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

Это просто плохо пахнет, и он теряет всю историю для загрузки. Должен быть лучший способ сделать это. Я уже заглянул в на СВН Книга но ничего не нашел, и теперь я смотрю вниз по списку тегов 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 - > Merge...
  • на С раздел введите ревизию, которая сделала delete
  • на до раздел введите ревизию перед удалением.
  • Нажмите кнопку "объединить"
  • фиксация

фокус в том, чтобы объединить назад. Слава Шон.Брайт!--25--> за то, что указал мне в правильном направлении!


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

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


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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

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


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

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

с Черепаха SVN:

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

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


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

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

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

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


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

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