SVN отменить удаление перед фиксацией

Если вы удалили каталог из рабочей копии SVN, но еще не зафиксировали, неясно, как его вернуть. Google даже предлагает "svn undo delete before commit" как обычный запрос, когда вы набираете "svn undo d", но результаты поиска бесполезны.

изменить: мне нужно решение, которое работает в Subversion 1.4.4


person LaC    schedule 23.11.2009    source источник
comment
Есть ли у удаленного вами родственные каталоги с ожидающими изменениями? В таком случае будьте осторожны при возврате с более высокого уровня, вы можете потерять изменения.   -  person Russell    schedule 24.11.2009


Ответы (7)


svn revert deletedDirectory

Вот документация по команде svn revert .


РЕДАКТИРОВАТЬ

Если deletedDirectory был удален с помощью rmdir, а не svn rm, вам необходимо сделать

svn update deletedDirectory

вместо.

person Michael Hackner    schedule 24.11.2009
comment
Это должно быть новое, это не работает в SVN 1.4.4. (Это было первое, что я попробовал.) - person LaC; 24.11.2009
comment
Это то, что говорит 1.4.4, btw: $ svn help revert revert: восстановить исходный файл рабочей копии (отменить большинство локальных изменений). использование: revert PATH ... Примечание: эта подкоманда не требует доступа к сети и разрешает любые конфликтные состояния. Однако он не восстанавливает удаленные каталоги. - person LaC; 24.11.2009
comment
1.6.6 имеет тот же текст в справке, но он работал у меня, когда я его тестировал. Обратите внимание: если вы не использовали svn delete для удаления каталога, а вместо этого удалили его с помощью rmdir, вам нужно вместо этого svn update deletedDirectory. - person Michael Hackner; 24.11.2009
comment
Я удалил один файл (svn del) из локального каталога svn-ed. svn update не работал, но svn revert работал. Я использовал SynchroSVN для Mac. Однако спасибо за советы. - person karim; 13.10.2010
comment
Я все еще не уверен, работает ли это с SVN 1.4.4, но меня это больше не волнует, поэтому я принимаю этот ответ. - person LaC; 12.02.2011
comment
Я по ошибке удалил все содержимое каталога (включая папку .svn), но не сам каталог. Решением было также удалить каталог, а затем запустить svn update directory_name. - person TRiG; 10.04.2013
comment
Согласно ссылке, используйте svn -R revert, чтобы отменить удаление всего каталога со всем содержимым, что, вероятно, именно то, что вам нужно. svn revert без -R просто восстанавливает каталог, а не его содержимое. - person n13; 01.08.2013
comment
У меня это не сработало. У меня сработали следующие команды: svn revert -R. свн вверх - person Mohd Farid; 31.03.2016
comment
Это не работает. Недопустимо, чтобы здесь люди публиковали неправильные ответы. @MichaelHackner должно быть стыдно. - person SmallChess; 04.02.2018

1) do

svn revert . --recursive

2) анализировать вывод на наличие ошибок, таких как

"Failed to revert 'dir1/dir2' -- try updating instead."

3) вызовите svn для каждого каталога ошибок:

svn up dir1/dir2
person Denis Barmenkov    schedule 15.09.2010
comment
Это наиболее точный ответ, большое спасибо, вы мне очень помогли. - person greenoldman; 08.02.2011
comment
За исключением того, что все возвращается в исходное состояние? Вы можете не захотеть этого делать. - person n13; 01.08.2013
comment
Это имеет наибольший смысл, если у вас есть вся папка, которая, по мнению SVN, была удалена. Это было у меня при проверке рабочей копии. Одна папка уже существует, поэтому возникла конфликтная ситуация и не была извлечена. Это была ссылка на другую папку. Я переименовал его и попытался svn up проверить, осознал конфликт, сделал svn resolved foo и svn status сказал мне, что у меня есть около 10 тыс. Файлов, помеченных как D. svn up и svn revert не вернули их, но это решило проблему. - person simbabque; 18.02.2014
comment
+1 за --recursive, который помогает восстановить содержимое удаленных каталогов. - person Melebius; 10.07.2014
comment
Боже мой, ты спас мне вечер! - person ArturOlszak; 07.03.2016
comment
Как и у simbabque, у меня была конфликтующая папка. Я пытался rm эту папку и svn update, но svn пометил папку для удаления из-за конфликта. Это решение частично сработало для меня. Он вернул папки, но не файлы. Запуск svn update также не вернул файлы. В итоге я удалил папку на один уровень выше, а затем с помощью svn update вернул файлы (спасибо @LaC). - person Steven C. Howell; 19.05.2016

Что сработало для меня, так это

svn revert --depth infinity deletedDir
person Jason    schedule 12.03.2014
comment
Это отлично сработало для меня (svn 1.7.10), где svn revert deletedDir не смог выполнить задание. Отличный ответ. - person rtome; 29.05.2015

Выполните (рекурсивную) операцию возврата с уровня выше удаленного вами каталога.

person Greg Hewgill    schedule 23.11.2009
comment
Это уничтожит НАМНОГО больше изменений, чем необходимо. - person Michael Hackner; 24.11.2009
comment
Это не работает с Subversion 1.4.4 (я только что пробовал). svn help revert даже сообщает, что эта подкоманда не требует доступа к сети, и разрешает любые конфликтующие состояния. Однако он не восстанавливает удаленные каталоги. Извините, надо было указать версию. 1.4.4 - это то, что поставляется с Mac OS X 10.5. - person LaC; 24.11.2009

Чтобы сделать его одним лайнером, вы можете попробовать что-то вроде:

svn status | cut -d ' ' -f 8 | xargs svn revert
person Earle    schedule 25.07.2013
comment
Я могу создать каталог с пробелами в его имени. Это может сломать «разрезать» AFAIK. - person Denis Barmenkov; 08.04.2019

Самым простым решением, которое я смог найти, было удалить родительский каталог из рабочей копии (с помощью rm -rf, а не svn delete), а затем запустить svn update в дедушке и дедушке. Например, если вы удалили a / b / c, rm -rf a / b, cd a, svn up. Это все возвращает. Конечно, это хорошее решение только в том случае, если у вас нет других незафиксированных изменений в родительском каталоге, которые вы хотите сохранить.

Надеюсь, эта страница будет в верхней части результатов в следующий раз, когда я буду гуглить этот вопрос. Было бы, конечно, даже лучше, если бы кто-нибудь предложил более чистый метод.

person LaC    schedule 23.11.2009
comment
Это предполагает, что в родительском каталоге нет подкаталогов с ожидающими изменениями. - person Russell; 24.11.2009

Вы можете удалить папку и обновить родительский каталог перед фиксацией:

rm -r some_dir

svn update some_dir_parent

person xinthose    schedule 12.07.2017