Как правильно восстановить удаленный файл из 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 для возврата внесенных изменений:
- щелкните правой кнопкой мыши родительскую папку, содержащую удаленные файлы / папку
- выберите "Показать журнал"
- выберите и щелкните правой кнопкой мыши на версии, перед которой были сделаны изменения / удалены
- выберите "Просмотр репозитария"
- Выберите файл/папку, которая должна быть восстановлена, и щелкните правой кнопкой мыши
- выберите "Копировать в", который будет копировать файлы / папки в редакцию head
надеюсь, что это поможет
Я всегда использую svn copy в качестве операции сервера, поэтому не уверен, работает ли он с двумя рабочими путями.
вот пример восстановления удаленного файла в локальную рабочую копию проекта:
svn copy https://repos/project/modules/module.js@3502 modules/module.js
находясь внутри каталога проекта. Это также работает для восстановления целых каталогов.
Если вы используете Tortoise SVN, вы должны иметь возможность вернуть изменения только из этой ревизии в свою рабочую копию (эффективно выполняя обратное слияние), а затем сделать еще одну фиксацию для повторного добавления файла. Шаги, чтобы следовать:
- перейдите в папку в рабочей копии, где вы удалили файл.
- перейдите в repo-браузер.
- перейдите к редакции, где вы удалили файл.
- В списке изменений, найдите файл, который вы удаленный.
- щелкните правой кнопкой мыши на файл и выберите "Отменить изменения из этой ревизии".
- это восстановит файл в вашей рабочей копии, сохраняя историю.
- зафиксируйте файл, чтобы добавить его обратно в репозиторий.
с Черепаха 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
синтаксис. (Хотя, возможно, я вспомнил бы его задом наперед...)