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

135

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

редактировать: я хотел бы решение, которое работает в Subversion 1.4.4

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

Ответы:

145

svn revert deletedDirectory

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


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

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

svn update deletedDirectory

вместо.

Майкл Хакнер
источник
3
Это должно быть новым, это не работает в SVN 1.4.4. (Это было первое, что я попробовал.)
LaC
4
Это то, что 1.4.4 говорит, между прочим: $ svn help revert revert: восстановить первичный файл рабочей копии (отменить большинство локальных изменений). Использование: вернуть PATH ... Примечание: эта подкоманда не требует доступа к сети и разрешает любые конфликтующие состояния. Тем не менее, он не восстанавливает удаленные каталоги.
LaC
1
1.6.6 имеет тот же текст в справке, но он работал для меня, когда я тестировал его. Обратите внимание, что если вы не использовали svn deleteдля удаления каталога, а вместо этого удалили его с помощью rmdir, вам нужно будет svn update deletedDirectoryвместо этого.
Майкл Хакнер
Я удалил один файл (svn del) из локальной директории svn-ed. SVN обновление не работает, но SVN Revert работает. Я использовал SynchroSVN для Mac. Тем не менее, спасибо за советы.
Карим
5
По ссылке используйте svn -R revert, чтобы восстановить весь каталог со всем содержимым, что, вероятно, и вам нужно. SVN Revert без -R просто восстанавливает каталог, а не содержимое.
n13
156

1) сделать

svn revert . --recursive

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

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

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

svn up dir1/dir2
Денис Барменков
источник
12
Это самый точный ответ, большое спасибо, вы мне очень помогли.
Гринольдман
1
Кроме того, что все отменяет? Вы можете не хотеть этого делать.
n13
1
Это имеет смысл, если у вас есть целая папка, которую SVN считает удаленной. Я имел это, проверяя рабочую копию. Одна папка уже существовала, поэтому она оказалась в конфликте и не была извлечена. Это была ссылка на другую папку. Я переименовал это и попытался svn upзаставить это проверить, понял конфликт, сделал svn resolved fooи svn statusсказал мне, что у меня было приблизительно 10k файлов, отмеченных как D. svn upи svn revertне вернул их, но это решило проблему.
simbabque
6
+1, за --recursiveкоторый помогает восстановить содержимое удаленных каталогов.
Мелебиус
1
Боже мой, ты спас мой вечер!
ArturOlszak
32

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

svn revert --depth infinity deletedDir
Джейсон
источник
Это прекрасно работает для меня (SVN 1.7.10), где SVN Revert УдаленныйDir не смог сделать эту работу. Отличный ответ.
rtome
4

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

Грег Хьюгилл
источник
1
Это уничтожит ПУТЬ больше изменений, чем необходимо.
Майкл Хакнер
Это не работает с Subversion 1.4.4 (я только что попробовал). svn help revert даже говорит: «эта подкоманда не требует доступа к сети и разрешает любые конфликтующие состояния. Однако она не восстанавливает удаленные каталоги». Извините, мне следовало указать версию. 1.4.4 - это то, что поставляется с Mac OS X 10.5.
LaC
4

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

svn status | cut -d ' ' -f 8 | xargs svn revert
Эрл
источник
Я могу создать каталог с пробелами в его имени. Это может сломать «вырезать» AFAIK.
Денис Барменков
1

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

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

лак
источник
Это при условии, что в родительском каталоге нет подкаталогов с ожидающими изменениями.
Рассел
0

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

rm -r some_dir

svn update some_dir_parent

xinthose
источник