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

119

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

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

Это просто плохо пахнет и теряет всю историю. Должен быть способ сделать это лучше. Я уже просматривал книгу SVN, но ничего не нашел и теперь просматриваю список тегов SVN.

BCS
источник
4
Несомненно, ответ Тукушана - это правильный прямой ответ на ваш вопрос, и его следует принять?
Джеймс МакКормак,
@JamesMcCormack: см. NB в его ответе.
BCS
2
Совет: если вы удалили файл и еще не зафиксировали изменения, просто щелкните правой кнопкой мыши, и обновление восстановит его.
Хаммад Хан

Ответы:

57

Используйте 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 -> Объединить ...
  • Убедитесь, что выбран параметр «Объединить диапазон версий», нажмите «Далее».
  • В текстовом поле «Диапазон ревизий для объединения» укажите ревизию, из которой был удален файл.
  • Установите флажок «Обратное слияние», нажмите «Далее».
  • Нажмите "Объединить"

Однако это совершенно не проверено.


Отредактировано OP : это работает с моей версией TortoiseSVN (старый вид без следующей кнопки)

  • Перейдите в папку, из которой были удалены материалы
  • Щелкните правой кнопкой мыши в проводнике, перейдите в TortoiseSVN -> Объединить ...
  • в разделе " От" введите ревизию, в которой было выполнено удаление
  • в разделе Кому введите ревизию перед удалением.
  • Нажмите "объединить"
  • совершить

Хитрость в том, чтобы слить в обратном направлении . Престижность sean.bright за то, что указал мне в правильном направлении!


Изменить: мы используем разные версии. Описанный мной метод отлично работал с моей версией TortoiseSVN.

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

Шон Брайт
источник
Я использую Windows, и у меня нет версии SVN с интерфейсом командной строки. вы знаете, как сделать это с помощью ortoiseSVN?
BCS
У черепахи есть «объединить» в контекстном меню. В нем есть поля, которые нужно заполнить для рев. Также "Пробный ход", чтобы проверить, правильно ли вы настроили. И помните, результат не засчитывается, пока вы его не зафиксируете. Вы можете вернуться, если все пойдет не так.
gbarry
Я бы сказал, что у OP есть более старая версия Tortoise. У более нового есть другой (подчиненный) диалог слияния
1800 ИНФОРМАЦИЯ
Я еще не видел НИКАКОЙ системы слияния, которая не отстой. Текст, файлы, каталоги, документы Word, фу. Думаю, это не решаемая проблема. OTOH вещи могут быть отстойными более или менее. :)
BCS
1
Если вы вернете несколько файлов, а затем вернетесь, один из них будет отменен. Ой! Думаю, я просто что-то ранил
BCS
176

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

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

  • Перейдите к папке с рабочей копией, которая ранее содержала файл.
  • Щелкните правой кнопкой мыши папку в проводнике, перейдите в TortoiseSVN -> Показать журнал.
  • Щелкните правой кнопкой мыши номер версии непосредственно перед ревизией, которая удалила файл, и выберите «Обзор репозитория».
  • Щелкните удаленный файл правой кнопкой мыши, выберите «Копировать в рабочую копию ...» и сохраните.

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

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

tekumara
источник
26
Это также можно выполнить непосредственно на сервере, что полезно, если удаленные файлы или папки были довольно большими: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Крейг,
Это правильный способ сделать это. Просто попробовал с TortoiseSVN 1.8.1, и он работает, как рекомендовано.
Доктор Джанлуиджи Зейн Занеттини
Отлично!! Просто и эффективно. Спасибо за решение
Хантер
Этот метод значительно упростил мне восстановление файла в дочерней ветке, которая была удалена из родительской. Возможно, есть способ сделать это merge, но я этого не понял.
arr_sea 07
«Непосредственно перед» в шаге 3 важен. На шаге 4 Tortoise продолжала жаловаться, что файл уже существует, хотя я удалил его с помощью удаления Windows. Сначала мне пришлось обновить свою рабочую копию. (Мой коллега удалил несколько файлов с помощью функции удаления Tortoise, а затем зафиксировал изменения.) TortoiseSVN 1.8.1.
leqid 05
27

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

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

Восстановление удаленных элементов

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

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

Восстановление удаленных элементов

gbarry
источник
3
Просто показывает, что большинство проблем - это знание того, что искать.
BCS
16

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

  1. Щелкните правой кнопкой мыши родительскую папку, содержащую удаленные файлы / папку.
  2. Выберите «показать журнал»
  3. Выберите и щелкните правой кнопкой мыши версию, до которой были внесены изменения / удаления.
  4. Выберите «просмотреть репозиторий»
  5. Выберите файл / папку, которую необходимо восстановить, и щелкните правой кнопкой мыши.
  6. Выберите «копировать в», чтобы скопировать файлы / папки в головную ревизию.

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

Мукул Джоши
источник
13

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

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

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

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

NullPoiиteя
источник
2
+1 Копия @ сработала. Копия -r, похоже, не работает для использования CollabNet svn 1.6.17 под Mac OSX.
Грей
2
Также используемая ревизия должна быть ревизией непосредственно перед удалением.
Серый
6

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

  1. Перейдите в папку в рабочей копии, в которой вы удалили файл.
  2. Заходим в репо-браузер.
  3. Перейдите к ревизии, в которой вы удалили файл.
  4. В списке изменений найдите удаленный файл.
  5. Щелкните файл правой кнопкой мыши и выберите «Отменить изменения из этой версии».
  6. Это восстановит файл в вашей рабочей копии с сохранением истории.
  7. Зафиксируйте файл, чтобы добавить его обратно в свой репозиторий.
davogones
источник
Хорошо, в этом случае вопрос был в том, как сделать то, что вы только что описали. (Ответ: используйте объединение в обратном направлении)
BCS
1
Я говорил о том, как это сделать в Tortoise SVN. Добавлю подробнее.
davogones
5

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

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

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

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

Дэниел Хониг
источник
3
SVN COPY - рекомендуемый подход. Синтаксис очень прост: svn copy [SVN URL] @ [REVISION # WHERE FILE EXISTS] [ЛОКАЛЬНЫЙ ПУТЬ ДЛЯ ВОССТАНОВЛЕНИЯ] из visualsvn.com/support/svnbook/branchmerge/basicmerging . Просто использовал это сам.
amit
Для меня это наиболее разумно, я тоже использую этот подход,
Дмитрий Пашкевич
4

С Tortoise SVN :

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

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

VonC
источник
отлично. Я попробую в следующий раз.
BCS
1

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

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

Дэвид З
источник
Я не этого хочу. Я хочу исправить файл обратно в репо, чтобы SVN знал, что это тот же файл.
BCS