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

StackOverflow https://stackoverflow.com/questions/490522

  •  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 для отмены внесенных изменений:

  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. Перейдите в репозиторий-браузер.
  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 это последняя редакция, при которой файл существовал.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top