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

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

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

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


person BCS    schedule 29.01.2009    source источник
comment
Несомненно, ответ Тукушана - это правильный прямой ответ на ваш вопрос, и его следует принять?   -  person James McCormack    schedule 29.11.2012
comment
@JamesMcCormack: см. NB в его ответе.   -  person BCS    schedule 29.11.2012
comment
Совет: если вы удалили файл и еще не зафиксировали изменения, просто щелкните правой кнопкой мыши, и обновление восстановит его.   -  person Hammad Khan    schedule 30.08.2013


Ответы (9)


Используйте 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.

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

person Sean Bright    schedule 29.01.2009
comment
Я использую Windows, и у меня нет версии SVN с интерфейсом командной строки. вы знаете, как сделать это с помощью ortoiseSVN? - person BCS; 29.01.2009
comment
У черепахи есть слияние в контекстном меню. В нем есть поля, которые нужно заполнить для рев. Также «Пробный прогон», чтобы проверить, правильно ли вы настроили. И помните, результат не засчитывается, пока вы его не зафиксируете. Вы можете вернуться, если все пойдет не так. - person gbarry; 29.01.2009
comment
Я бы сказал, что у OP есть более старая версия Tortoise. У более нового есть другой (подчиненный) диалог слияния - person 1800 INFORMATION; 29.01.2009
comment
Я еще не видел НИКАКОЙ системы слияния, которая не отстой. Текст, файлы, каталоги, документы Word, фу. Думаю, это не решаемая проблема. OTOH вещи могут быть более или менее отстойными. :) - person BCS; 29.01.2009
comment
Если вы вернете несколько файлов, а затем вернетесь, один из них будет отменен. Ой! Думаю, я просто что-то поранил. - person BCS; 29.01.2009
comment
Для Tortoise SVN проще восстановить только один файл, который вы удалили путем обратного слияния из журнала изменений. (См. Шаги в моем сообщении) - person davogones; 30.01.2009
comment
это кажется справедливым ответом, но не уверен, почему слияние SVN оправдано по сравнению с копией svn? - person Daniel Honig; 10.09.2009
comment
Рекомендуемый способ находится здесь: svnbook.red- bean.com/en/1.7/svn.ref.svn.c.copy.html и здесь: svnbook.red-bean.com/en/1.1/ch04s04.html#svn-ch-4-sect-4.3 - person Prince; 08.04.2014

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

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

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

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

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

person tekumara    schedule 05.08.2009
comment
Это также можно выполнить непосредственно на сервере, что полезно, если удаленные файлы или папка были довольно большими: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path - person Craig; 24.10.2011
comment
Это правильный способ сделать это. Просто попробовал с TortoiseSVN 1.8.1, и он работает, как рекомендовано. - person Dr. Gianluigi Zane Zanettini; 03.09.2013
comment
Идеально!! Просто и эффективно. Спасибо за решение - person Hunter; 06.09.2013
comment
Этот метод значительно упростил мне восстановление файла в дочерней ветке, которая была удалена из родительской. Возможно, есть способ сделать это с merge, но я этого не понял. - person arr_sea; 08.01.2014
comment
Важно только предварительное выполнение шага 3. На шаге 4 черепаха продолжала жаловаться на то, что файл уже существует, хотя я удалил его с помощью удаления Windows. Сначала мне пришлось обновить свою рабочую копию. (Мой коллега удалил несколько файлов с помощью функции удаления черепахи, а затем зафиксировал изменения.) TortoiseSVN 1.8.1. - person leqid; 05.02.2014
comment
Немного окольным образом, но это работает! После выбора Копировать в рабочую копию ... мне пришлось просмотреть все рабочие папки моего проекта, чтобы добраться до нужного места. - person yoyo; 08.04.2014
comment
Я попытался использовать принятый ответ, но это не сработало. И попробовал, это сработало отлично. На мой взгляд, это должен быть принятый ответ. Наконец, я возвращаю свои удаленные папки и файлы из SVN, иначе меня могут уволить из офиса. - person Yubaraj; 01.09.2014
comment
В более новых версиях TortoiseSVN с графическим интерфейсом вы можете просто выбрать фиксацию, в которой были удалены файлы, а затем в списке файлов под журналом щелкнуть правой кнопкой мыши удаленный файл и выбрать «Вернуть к родительской ревизии». По крайней мере, у меня это работает. - person MC Emperor; 30.06.2016
comment
Если вы удалили тег, вы можете просто скопировать его обратно в свой тег. - person iheanyi; 09.10.2017

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

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

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

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

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

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

person gbarry    schedule 29.01.2009
comment
Просто показывает, что большинство проблем - это знание того, что искать. - person BCS; 29.01.2009

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

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

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

person Mukul Joshi    schedule 12.10.2010

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

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

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

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

person NullPoiиteя    schedule 17.09.2012
comment
+1 Копия @ сработала. Копия -r, похоже, не работает для использования CollabNet svn 1.6.17 под Mac OSX. - person Gray; 11.10.2013
comment
Также используемая ревизия должна быть ревизией справа перед удалением. - person Gray; 09.09.2015

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

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

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

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

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

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

person Daniel Honig    schedule 09.09.2009
comment
SVN COPY - рекомендуемый подход. Синтаксис очень прост: svn copy [URL SVN] @ [REVISION # WHERE FILE EXISTS] [ЛОКАЛЬНЫЙ ПУТЬ ДЛЯ ВОССТАНОВЛЕНИЯ] из visualsvn.com/support/svnbook/branchmerge/basicmerging. Просто использовал это сам. - person amit; 09.02.2012
comment
Для меня это имеет смысл, я тоже использую этот подход - person Dmitry Pashkevich; 17.09.2012

С помощью Tortoise SVN:

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

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

person VonC    schedule 29.01.2009
comment
Ницца. Я попробую в следующий раз. - person BCS; 29.01.2009

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

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

person David Z    schedule 29.01.2009
comment
Я не этого хочу. Я хочу исправить файл обратно в репо, чтобы SVN знал, что это тот же файл. - person BCS; 29.01.2009