Каков правильный способ восстановления удаленного файла из 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, вам необходимо убедиться, что "Остановить копирование/переименование" не отмечено в диалоговом окне "Сообщения журнала".
Ответ 3
Для полноты, это то, что вы нашли бы в книге svn, если бы вы знали, что искать. Это то, что вы уже обнаружили:
Отмена изменений
Воскрешение удаленных элементов
То же самое, из более поздней (и подробной) версии книги:
Отмена изменений
Воскрешение удаленных элементов
Ответ 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
. (Хотя я мог бы вспомнить это назад...)