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


102

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

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

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

+4

Несомненно, ответ тукушана является правильным ответом на ваш вопрос и должен быть принят? 29 ноя. 122012-11-29 15:28:59

  0

@JamesMcCormack: см. NB в своем ответе. 29 ноя. 122012-11-29 18:03:35

+1

Совет, если вы удалили файл и еще не совершили изменение, просто нажмите righ и обновите его, чтобы восстановить его. 30 авг. 132013-08-30 15:16:55

49

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

Это совершенно непроверенные, однако ,


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

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

Хитрость заключается в том, чтобы объединить назад. Kudos до sean.bright для указания меня в правильном направлении!


Edit: Мы используем различные версии.Метод, который я описал, отлично работал с моей версией TortoiseSVN.

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

  0

Я нахожусь в окнах и не имею версию SVN для CLI. знаете ли вы, как это сделать ortoiseSVN? 29 янв. 092009-01-29 05:04:18

  0

Черепаха имеет «слияние» в меню правой кнопки мыши. У него есть поля для заполнения. Также «Dry Run», чтобы узнать, правильно ли вы настроили его. И помните, результат не засчитывается, пока вы его не зафиксируете. Вы можете вернуться, если все будет идти. 29 янв. 092009-01-29 05:08:46

  0

Я бы сказал, что у ОП есть более старая версия Черепахи. У более нового есть другой (более низкий) диалог слияния 29 янв. 092009-01-29 05:56:03

  0

Я еще не видел ЛЮБОЙ системы слияния, которая не сосала. Текст, файлы, dirs, Word docs, yuck. Я думаю, что это не решаемая проблема. OTOH вещи могут сосать более или менее. :) 29 янв. 092009-01-29 06:08:01

+1

Если вы отмените несколько файлов, а затем верните одно из ревертов, это не исправляется. Ой! Я что-то делаю. 29 янв. 092009-01-29 06:13:57

  0

Для Tortoise SVN проще вернуть только один файл, который вы удалили путем обратного слияния из журнала изменений. (См. Шаги в моем сообщении) 30 янв. 092009-01-30 01:09:20

  0

это похоже на справедливый ответ, но не уверен, почему слияние SVN оправдано с помощью SVN-копии? 09 сен. 092009-09-09 21:21:01

+1

сладкий сладкий обезьяны шары. Спасибо тебе за это. спас меня 04 янв. 112011-01-04 11:14:32

  0

Рекомендуемый способ: http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.copy.html и здесь: http://svnbook.red-bean.com /en/1.1/ch04s04.html#svn-ch-4-sect-4.3 08 апр. 142014-04-08 19:13:30


0

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

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

  0

Это @rev, я думал? 29 янв. 092009-01-29 05:04:33

  0

Угадаю, я исправил его, пока вы комментировали ... 29 янв. 092009-01-29 05:09:11

  0

Это не то, что я хочу. Я хочу исправить файл обратно в репо, и SVN знает, что это тот же файл. 29 янв. 092009-01-29 05:17:03


4

С Tortoise SVN:

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

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

  0

приятно. Я попробую в следующий раз. 29 янв. 092009-01-29 05:27:03


5

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

  1. Просмотрите папку в рабочей копии, где вы удалили файл.
  2. Перейти к репо-браузеру.
  3. Просмотрите, где вы удалили файл.
  4. В списке изменений найдите файл, который вы удалили.
  5. Щелкните правой кнопкой мыши по файлу и перейдите к разделу «Отменить изменения из этой ревизии».
  6. Это восстановит файл вашей рабочей копии, сохранив историю.
  7. Зафиксируйте файл, чтобы добавить его обратно в свой репозиторий.
  0

, который теряет историю 29 янв. 092009-01-29 05:17:33

  0

Я сделал это раньше и не потерял историю. 29 янв. 092009-01-29 06:03:25

  0

ОК в этом случае вопрос заключался в том, как делать то, что вы только что описали. (Ответ: используйте слияние назад) 29 янв. 092009-01-29 06:10:17

+1

Я говорил о том, как это сделать в Tortoise SVN. Я добавлю больше деталей. 30 янв. 092009-01-30 01:03:40


25

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

Undoing Changes

Resurrecting Deleted Items

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

Undoing Changes

Resurrecting Deleted Items

+3

Просто идет, чтобы показать, что большинство проблем - это знать, что искать. 29 янв. 092009-01-29 18:57:38


158

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

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

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

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

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

+25

Это также может быть выполнено непосредственно на сервере, полезно, если удаленные файлы или папка были довольно большими: 'svn cp -r 1993 http://example.com/svn/trunk/[email protected] http://example.com/svn/trunk/path' 24 окт. 112011-10-24 08:05:16

+9

Выглядит так, как будто это должен быть принятый ответ! 29 апр. 132013-04-29 18:50:42

  0

Это правильный способ сделать это. Просто попробовал TortoiseSVN 1.8.1, и он работает как рекомендуется. 03 сен. 132013-09-03 06:47:59

  0

Отлично !! Простой и эффективный. Спасибо за решение 06 сен. 132013-09-06 09:47:48

  0

Этот метод значительно облегчил мне восстановление файла в дочернюю ветвь, которая была удалена из родительской ветви. Возможно, был способ сделать это с помощью 'merge', но я не понял этого. 07 янв. 142014-01-07 21:50:53

  0

«Как раз перед» на шаге 3 важно. На шаге 4 Tortoise продолжал жаловаться на то, что файл уже существует, хотя я удалил его с помощью Windows delete. Сначала мне пришлось обновить рабочую копию. (Мой коллега удалил несколько файлов, используя удаление Tortoise, а затем зафиксировал изменения.) TortoiseSVN 1.8.1. 05 фев. 142014-02-05 17:27:31

  0

Немного круто, но это работает! После того, как вы выбрали «Копировать в рабочую копию ...», мне пришлось полностью просмотреть все рабочие папки проекта, чтобы добраться до нужного места. 07 апр. 142014-04-07 22:29:27

  0

Я пробовал использовать принятый ответ, но не работал. И попробовал это, он отлично работал. По-моему, это должен быть принят ответ. Наконец, я возвращаю удаленные папки и файлы из SVN, иначе меня могут уволить из моего офиса. 01 сен. 142014-09-01 12:40:00

  0

С более новыми графическими версиями TortoiseSVN вы можете просто выбрать фиксацию, где были удалены файлы, а затем в файлах, перечисленных ниже журнала, щелкните правой кнопкой мыши удаленный файл и выберите «Вернуть родительскую ревизию». По крайней мере, это работает для меня. 30 июн. 162016-06-30 07:06:11

  0

Если вы удалили тег, вы можете просто сделать копию для возврата к тегу. 09 окт. 172017-10-09 15:47:31


4

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

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

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 [URL SVN] @ [ПЕРЕСМОТР # ГДЕ ФАЙЛ СУЩЕСТВУЕТ] [ЛОКАЛЬНАЯ ПУТЬ ДЛЯ ВОССТАНОВЛЕНИЯ] с http://www.visualsvn.com/support/svnbook/branchmerge/basicmerging/. Просто использовал это сам. 09 фев. 122012-02-09 07:55:08

  0

Это имеет смысл для меня, я также использую этот подход 17 сен. 122012-09-17 10:47:11


15

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

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

Надежда, что помогает


11

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

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

svn copy https://repos/project/modules/[email protected] modules/module.js 

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

+2

+1 Копия @ работала. Копия -r, похоже, не работает для использования CollabNet svn 1.6.17 под Mac OSX. 11 окт. 132013-10-11 18:35:30

+2

Также используемая ревизия должна быть правом на редактирование _before_ удаления. 09 сен. 152015-09-09 16:25:09