Есть ли способ восстановиться после случайного «возврата к svn»?

95

Сегодня утром мне удалось прострелить себе ногу, выполнив следующие действия:

  1. Началась работа над изменением моего проекта
  2. Кучу правок в кучу файлов
  3. Понял, что мой подход был неправильным, и что мне нужно начинать сначала
  4. cd'd на верхний уровень моего проекта и выполнил "svn --recursive revert". чтобы восстановить мою локальную песочницу до состояния до изменений.
  5. Завыл от ужаса, когда понял, что в моей локальной песочнице произошел ряд других изменений, и я только что стер их все. (сервер svn не работал в прошлую пятницу, поэтому я не смог их зарегистрировать и забыл о них на выходных)

К счастью, в этом случае я сделал "svn diff> temp.txt" перед уходом с работы в пятницу, и файл temp.txt все еще был на моем жестком диске, поэтому я смог загрузить этот файл в "патч" и восстановить свой потерял изменения.

Но для моей справки в будущем (т.е. в следующий раз, когда я сделаю ту же глупую ошибку) ... есть ли способ сказать svn отменить "svn revert"? Сохраняет ли svn где-нибудь резервную копию локальных / незарегистрированных различий?

Джереми Фриснер
источник
34
IIRC TortoiseSVN перемещает восстановленные файлы в корзину, но исходный клиент командной строки SVN не имеет таких нюансов.
Дарио Солера
1
Я не могу найти файл в корзине. Мне не повезло?
dalcantara
5
Верхний комментарий относительно корзины. Это просто спасло мне день!
OrganicPanda,
2
мой тоже! Спасибо большое. Восстановленный файл только что появился в моей корзине, и его можно было восстановить.
sladda
1
Вы только что спасли мою задницу с помощью этой корзины !!!
Epirocks

Ответы:

79

Нет, (абсолютно) НЕТ .

Если вы скажете Subversion, что нужно вернуть файл, все изменения улетучиваются.

Только ваша память может вернуть их.

Исключение: новые файлы, которые вы добавили, потеряют только свой статус «добавлен», но файл останется в этом каталоге, только статус неизвестен («?»)

Исключение платформы / программного обеспечения: при использовании TortoiseSVN в Windows функция «Восстановить» сначала помещает файлы в корзину, а затем возвращает их обратно. Вы можете покопаться в Корзине, чтобы восстановить файлы.

Питер Паркер
источник
10
Дополнение к вышесказанному: Контроль версий поможет вам только в том случае, если вы действительно зафиксируете файлы. Если вы находитесь в положении, когда убийство вашей рабочей копии убьет часы работы, значит, вы совершаете коммит недостаточно часто.
myron-semack 05
1
Согласен ... в этом случае svn-сервер не работает, и поэтому у меня все еще ожидаются незавершенные изменения. : ^ (
Джереми Фриснер
13
Да!!! В зависимости от вашей операционной системы и / или IDE есть способ выздоровления - прочтите другие ответы ниже, прежде чем у вас случится сердечный приступ !!
HDave
2
Это неправда, это немного сложнее, чем просто НЕТ. Воспользуйтесь инструментом восстановления или, если вам повезет, файлы окажутся в корзине.
RaphMclee
1
@RalphMclee: Это зависит от платформы и клиента svn. TortoiseSVN сохранит возвращенные новые файлы в корзину. Это просто исключение. И я сомневаюсь, что инструмент восстановления может последовательно восстановить изменения в ваших файлах. Это намного проще и понятнее запомнить: откат разрушит вашу работу, используйте ее осторожно!
Питер Паркер
104

Есть решение ... перейдите в корзину, там вы найдете последнюю версию удаленного файла. Черепаха «выбрасывает» в корзину каждый файл, который она восстанавливает.

што
источник
2
Кстати, именно поэтому TortoiseSVN кажется таким медленным при выполнении откатов. Перемещение файла в корзину - очень медленная операция, когда корзина заполнена. Вы можете отключить эту функцию в настройках TortoiseSVN «Общие - диалоги 1».
Вим Коенен,
8
Спасибо, чувак, ты меня спас! Я случайно сделал Revert и почти потерял 2 недели работы. К счастью, я нашел его в мусорной корзине.
Ари Лившин,
2
@ArieLivshin, зачем вам работать две недели, не совершая никаких действий? Похоже, вам нужно больше узнать о ветках.
JoelFan
К сожалению, ankhsvn этого не делает
Фил Хейл
Спасибо .. Очень полезно.
Prem Singh Bist,
32

Не совсем для Subversion, но если вы работаете с Eclipse, вы можете попытать счастья в местной истории.

Теперь кое-что более специфичное для Subversion: если вы не хотите создавать ветвь для каждого изменения, которое вы делаете, вы можете оставить пару стволов на месте (trunk-modif-1, trunk-modif-2 .. .). Каждая «модификация» выполняется в отдельном дереве, и вам нужно только вести список, чья проверка соответствует какой модификации.

Или вы можете использовать Git локально, но я никогда не пробовал.

Владимир
источник
3
К вашему сведению - перейдите к местной истории через контекстное меню правой кнопки мыши «Восстановить из локальной истории».
HDave
Для части Eclipse вот более конкретный ответ: stackoverflow.com/a/18220708/517705
Sk8erPeter
14

Недавно сделал эту ошибку, не фиксируя новые изменения файлов (около 10) в SVN, и все они исчезли из-за моей глупой ошибки. Но меня спасла опция Windows «Восстановить предыдущие версии» в контекстном меню. Уф, это было облегчение и урок.

Программист
источник
Спасибо! Это избавило меня от необходимости переделывать часы работы! Я никогда раньше не видел эту особенность окон, но она спасла меня!
NibblyPig
Куда я могу отправить вам 6000 долларов, сэкономив таким образом дни работы? Урок усвоен ...
HDave
Спасибо, это спасло мне день.
Opax Web
Я оставляю контрольную точку, поддерживающую такое восстановление, отключенной, потому что это снижает производительность. Недавно Eclipse удалил папку с моими проектами, включая архив git, из-за проблемы с функцией отмены, и мне очень хотелось, чтобы она была включена. Однако программа Windows под названием Recuva спасла меня, выполнив поиск в удаленном файловом пространстве. Я был очень осторожен, чтобы не добавлять дополнительный контент на затронутый диск, пока я не восстановил все свои файлы, и это давало мне все исходные файлы, измененные с момента моей последней резервной копии неделей ранее. Двоичные файлы в большинстве случаев не подлежали восстановлению.
Карл
8

Вы не можете восстановить файлы, если используете клиент командной строки svn .

Но вы можете восстановить их, если используете TortoiseSVN в качестве клиента svn. TortoiseSVN автоматически переместит их в вашу корзину. Вы можете восстановить их оттуда после случайного возврата.

Это настраиваемая опция в TortoiseSVN. Он находится в разделе « Настройки» -> «Диалог 1» -> «Использовать корзину при возврате».

По умолчанию он отмечен, что означает, что файлы перемещаются в корзину. Если вы хотите (в большинстве случаев вы не хотите отключать это. Если у вас есть причина, дайте мне знать)

Манохар
источник
1
Потрясающе! ... спас меня
Джанани Кумар
6

Если вы используете InteliJ, то вам повезло. В верхнем меню у вас есть опция контроля версий, а под ней вы найдете опцию локальной истории, где вы найдете всю историю для выбранного файла, включая все операции, которые вы сделали с этим файлом (обновление, фиксация, возврат).

Удачи, Аркде

Аврелиан Котуна
источник
1
И если это был новый файл, сам файл будет удален. В этом случае выберите папку, в которой находился файл, в представлении «Проект», а затем выберите «Локальная история». IntelliJ снова спас положение.
Nufail 05
4

Также, если вы вернули свой код .NET (файлы .cs и т. Д.) И создали приложение до возврата, но после внесения изменений, вы можете восстановить изменения из файла сборки, используя любой из инструментов отражателя для просмотра кода.

scor4er
источник
3

Мне очень повезло найти локальный журнал изменений файла (Local Revisions) в браузере истории в Eclipse. Я изучал различия одно за другим и сделал пару сохранений в файле перед перезаписью.

фыц
источник
2

Я вернул решение (Visual Studio + AnkhSVN) и потерял изменения в нескольких файлах. Я не могу найти файл в корзине.

НО: Я восстановил потерянные файлы с помощью Handy Recovery, т.е. SVN просто удаляет мои файлы при возврате.

Используйте любое программное обеспечение для восстановления данных для восстановления возвращенных файлов (например, пробную версию Handy Recovery )

Питер Барбаньяга
источник
1

Нет, SVN не ведет журнал или резервную копию (хотя есть решение для TortoiseSVN, указанное в других ответах).

Но если кто-то просматривает ответы и не заметил этот комментарий в вопросе OP:

«К счастью, в этом случае я сделал« svn diff> temp.txt »перед уходом с работы в пятницу, и файл temp.txt все еще был на моем жестком диске, поэтому я смог загрузить этот файл в« патч »и восстановить мои потерянные изменения ".

Я полагаю, что это обычная парадигма делать 'svn diff' ДО того, как вы сделаете 'svn revert'. Если у вас появится привычка делать это, даже если разница просто выводится на терминал, у вас есть по крайней мере один возможный способ восстановить потерянные изменения.

Шанеб
источник