Есть ли в Subversion команда для сброса рабочей копии?

110

Есть ли одна команда Subversion, которая «сбросит» рабочую копию точно до состояния, хранящегося в репозитории? Что-то вроде git reset --hardили (ха, жесткий сброс Git тоже не удаляет неверсированные файлы!) rm -rf wc && svn co <url> wc.

Обновление: я не хочу простого возврата, так как это не удаляет лишние файлы в рабочей копии. Я действительно хочу что-то, что было бы таким же, как удаление рабочей копии и повторная проверка, только без повторной загрузки данных. (Очевидно, я не против потерять все незафиксированные изменения.)

зул
источник
отменить все изменения в рабочей копии?
mauris 01
5
Вы бы использовали git clean -xdfдля удаления вещей, которые не находятся под контролем источника.
vcsjones 01
1
@vcsjones: Спасибо, справочная страница git cleanцитирует именно то, что я ищу: «Это можно использовать (возможно, вместе с git reset) для создания нетронутого рабочего каталога для проверки чистой сборки». Жалко, что Subversion, похоже, не имеет ничего подобного встроенного.
zoul 01

Ответы:

180

Вы можете рекурсивно вернуться следующим образом:

svn revert --recursive .

Невозможно (без написания творческого сценария) удалить вещи, которые не находятся под контролем источника. Я думаю, что самое близкое, что вы могли бы сделать, - это перебрать все файлы, использовать затем grep результат svn listи, если grep не работает, удалить его.

РЕДАКТИРОВАТЬ : решение для творческого сценария находится здесь: автоматически удалять неверсированные файлы Subversion

Таким образом, вы можете создать сценарий, который сочетает в себе revertлюбой ответ в связанном вопросе, который вам подходит.

vcsjones
источник
3
Возможно, вы также захотите svn cleanupсначала запустить туалет. Это моя стандартная практика очистки после прерванных слияний и прочего.
Майк Миллер
tortoise также имеет параметр «удалить неверсированные файлы» в диалоговом окне очистки.
v.oddou 05
2
Было бы неплохо, если бы «удалить неверсированные файлы» был доступен через командную строку. Специально для автоматизированных сборок.
C. Tewalt 03
3
Смотрите мой ответ ... --remove-unversioned существует для очистки svn
Денни Вайнберг
38

Чтобы вернуть отслеживаемые файлы

svn revert . -R

Чтобы очистить неотслеживаемые файлы

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rfМожет / должен выглядеть страшно сначала, но как только понял , что это не будет по следующим причинам:

  1. Только полностью неотслеживаемые каталоги будут соответствовать шаблону, переданному в rm
  2. -rfТребуется, иначе эти каталоги не будут удалены

Чтобы вернуться, затем очистите (вопрос OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Для постоянной простоты использования

Добавьте постоянный псевдоним к вашему .bash_aliases

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'
Никлаузг
источник
второй фрагмент, похоже, не работает для меня:awk: fatal: error reading input file '-': Input/output error
hbogert
Мне пришлось экранировать команду ?в awkкоманде, иначе она совпала бы со всеми строками в выводеsvn status
gpanders
23

Удалите все внутри вашей локальной копии, используя:

rm -r your_local_svn_dir_path/*

И верните все рекурсивно, используя следующую команду.

svn revert -R your_local_svn_dir_path

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

Вивек Ядав
источник
4
гораздо быстрее svn cleanup --remove-unversioned.
Znik
7
svn revert . -R

сбросить все.

svn revert path/to/file

для одного файла

Эйб Фолькер
источник
1
Это не удаляет лишние неверсированные файлы в рабочей копии, не так ли?
zoul 01
@zoul Я так не думаю, но не цитируйте меня по этому поводу, так как я давно не использовал SVN
Эйб Фелькер
к сожалению, это не касается не отслеживаемых файлов. попробуйте svn revert -R your_local_svn_dir_path
Znik
7

Удалите неверсированные файлы и отмените все изменения:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Вне:

D         D:\tmp\sql\update\abc.txt
Денни Вайнберг
источник
1
это лучший ответ без дополнительных сценариев. это универсально и совместимо со многими версиями svn.
Znik
3

Чистое решение Windows cmd / bat:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Андрей Ф.
источник
2

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


источник
Уж больно медленно. Вот почему я искал способ обойти это.
zoul 01
1
+1, часто это единственный способ исправить странные проблемы, по крайней мере, что я нашел.
Брэд
2

Очень быстро и просто, и сделает именно то, что вы хотите

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Config|.ini)/ предназначен для моих целей.

И было бы неплохо добавить --no-ignore к команде svn

user1299374
источник
2
Это так ужасно. Что насчет пользователей Windows? Очевидно, что Subversion требует некоторой доработки, прежде чем ее можно будет воспринимать всерьез как инструмент контроля версий.
Уоррен П.
1

Чтобы удалить неотслеживаемые файлы

Я смог перечислить все неотслеживаемые файлы, о которых сообщил svn stв bash, выполнив:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Если вам повезет, вы можете заменить echoна, rmчтобы удалить неотслеживаемые файлы. Или скопируйте файлы, которые хотите удалить, вручную, если вам не повезло.


(Я использовал @ ABE-Воелкер «s ответ вернуться оставшиеся файлы: https://stackoverflow.com/a/6204601/1695680 )

ТорСаммонер
источник