Каков правильный способ восстановить удаленный файл из SVN?
-
20-08-2019 - |
Вопрос
Я удалил файл из репозитория и теперь хочу поместить его обратно.Лучшее, что я могу придумать, это:
- обновите до редакции перед удалением
- скопируйте файлы в другое место
- обновление для главы
- скопируйте файлы обратно
- добавьте их
- совершить
Это просто плохо пахнет и при этом теряет всю историю в придачу.Должен быть лучший способ сделать это.Я уже заглянул в Книга SVN но ничего не нашел и теперь просматриваю список тегов SVN.
Решение
Используйте слияние svn:
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 -> Объединить...
- Убедитесь, что выбран параметр "Объединить диапазон ревизий", нажмите кнопку Далее
- В текстовом поле "Диапазон версий для объединения" укажите редакцию, которая удалила файл
- Установите флажок "Обратное слияние", нажмите Далее
- Нажмите кнопку Объединить
Однако это совершенно непроверено.
Отредактировано OP:Это работает на моей версии TortoiseSVN (старая версия без кнопки next).
- Перейдите в папку, из которой был удален материал
- Щелкните правой кнопкой мыши в Проводнике, перейдите в TortoiseSVN -> Объединить...
- в От раздел введите редакцию, которая выполнила удаление
- в Для раздел введите редакцию перед удалением.
- Нажмите "Объединить".
- совершить
Хитрость заключается в слиянии задом наперед.Престижность для шон.яркий за то, что указал мне правильное направление!
Редактировать: Мы используем разные версии.Метод, который я описал, отлично работал с моей версией TortoiseSVN.
Также следует отметить, что если в коммите, который вы объединяете в обратном порядке, было внесено несколько изменений, вы захотите отменить эти другие изменения после завершения слияния перед фиксацией.Если вы этого не сделаете, эти дополнительные изменения также будут отменены.
Другие советы
Проблема с выполнением слияния svn, предложенного Шоном Брайтом, заключается в том, что оно повторно вносит другие изменения, сделанные в той же редакции, что и удаление.Копирование svn - это более целенаправленная операция, которая затронет только удаленные файлы.
Используя Tortoise SVN, вы можете восстановить файл, который был удален из вашей рабочей копии каталога и из более поздних версий SVN, с помощью svn-копии следующим образом:
- Перейдите к папке рабочей копии, в которой ранее содержался файл.
- Щелкните правой кнопкой мыши на папке в Проводнике, перейдите в TortoiseSVN -> Показать журнал.
- Щелкните правой кнопкой мыши по номеру редакции, непосредственно предшествующей редакции, которая удалила файл, и выберите "Просмотреть репозиторий".
- Щелкните правой кнопкой мыши на удаленном файле и выберите "Скопировать в рабочую копию ..." и сохраните.
Удаленный файл теперь будет находиться в папке рабочей копии.Чтобы повторно добавить его обратно в SVN, щелкните правой кнопкой мыши на восстановленном файле и выберите SVN Commit.
ПРИМЕЧАНИЕ:Этот метод сохранит предыдущую историю восстановленного файла, однако, чтобы просмотреть предыдущую историю в журнале TortoiseSVN, вам нужно убедиться, что флажок "Остановить копирование / переименование" снят в диалоговом окне сообщений журнала.
Для полноты картины, это то, что вы нашли бы в книге svn, если бы знали, что искать.Это то, что вы уже обнаружили:
Воскрешение удаленных элементов
То же самое, из более поздней (и подробной) версии книги:
Используйте функцию копирования Tortoise SVN для отмены внесенных изменений:
- Щелкните правой кнопкой мыши родительскую папку, содержащую удаленные файлы / папку
- Выберите "показать журнал".
- Выберите и щелкните правой кнопкой мыши версию, перед которой были внесены изменения / удалены
- Выберите пункт "просмотреть репозиторий".
- Выберите файл / папку, которые необходимо восстановить, и щелкните правой кнопкой мыши
- Выберите "копировать в", который скопирует файлы / папки в редакцию head
Надеюсь, это поможет
Кажется, я всегда использую svn copy в качестве серверной операции, поэтому не уверен, работает ли это с двумя рабочими путями.
Вот пример восстановления удаленного файла в локальную рабочую копию проекта:
svn copy https://repos/project/modules/module.js@3502 modules/module.js
Находясь внутри каталога проекта.Это также работает для восстановления целых каталогов.
Если вы используете Tortoise SVN, вы должны иметь возможность возвращать изменения только из этой редакции в свою рабочую копию (эффективно выполняя обратное слияние), затем выполните еще одну фиксацию для повторного добавления файла.Шаги, которым необходимо следовать, следующие:
- Перейдите к папке в рабочей копии, из которой вы удалили файл.
- Перейдите в репозиторий-браузер.
- Перейдите к редакции, в которой вы удалили файл.
- В списке изменений найдите файл, который вы удалили.
- Щелкните правой кнопкой мыши на файле и перейдите в раздел "Отменить изменения из этой редакции".
- Это восстановит файл в вашей рабочей копии с сохранением истории.
- Зафиксируйте файл, чтобы добавить его обратно в ваш репозиторий.
С Черепаха 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
это последняя редакция, при которой файл существовал.
Мне пришлось сделать именно это некоторое время назад, и, если я правильно помню, используя -r
возможность svn
не сработало;Я должен был использовать :rev
синтаксис.(Хотя я, возможно, вспомнил бы это задом наперед ...)