Чи є команда Subversion для скидання робочої копії?


110

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

Оновлення: я не після простого відновлення, оскільки це не видаляє зайві файли з робочої копії. Я дуже хочу, щоб було те саме, що видалити робочу копію та перевірити її знову, лише не завантажуючи дані знову. (Очевидно, я не проти втратити всі невідомі зміни.)


повернення всіх змін у робочу копію?
mauris

5
Ви хочете git clean -xdfвидалити речі, які не знаходяться під контролем джерела.
vcsjones

1
@vcsjones: Дякую, сторінка man для git cleanцитат саме того, що я шукаю: "Це можна використовувати (можливо, в поєднанні з перезавантаженням git) для створення незайманого робочого каталогу для перевірки чистої збірки". Шкода, що Subversion, здається, не має нічого подібного вбудованого.
Зуль

Відповіді:


180

Ви можете рекурсивно повернути так:

svn revert --recursive .

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

РЕДАКТУВАННЯ : Рішення для креативного сценарію знаходиться тут: Автоматично видаляйте неперевершені файли Subversion

Таким чином, ви могли б створити сценарій, який поєднує в собі відповідь revertіз відповідним запитанням у пов'язаному питанні.


3
Можливо, ви також хочете спочатку запуститись svn cleanupна туалеті. Це моя стандартна практика прибирання після перерваних злить і чогось іншого.
Майк Міллер

черепаха також має опцію "видалити неперевершені файли" у діалоговому вікні очищення.
v.oddou

2
Було б добре, якби «видалити неперевершені файли» було доступно через командний рядок. Спеціально для автоматизованих побудов.
C. Tewalt

3
Дивіться мою відповідь ... - існує неперевершена версія для очищення svn
Denny Weinberg

38

Повернення відстежених файлів

svn revert . -R

Очищення файлів без треку

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

Спочатку -rfможе виглядати страшно, але колись зрозумів, це не буде з цих причин:

  1. Лише повністю відслідковувані каталоги будуть відповідати шаблону, переданому до rm
  2. Це -rfпотрібно, інакше ці каталоги не будуть видалені

Щоб відновити, потім очистіть (питання щодо ОП)

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) ;)'

2-й фрагмент, здається, не працює для мене: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 - перемикання без перегляду.
Зник

7
svn revert . -R

щоб все скинути.

svn revert path/to/file

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


1
Це не видаляє зайві неперевершені файли з робочої копії, чи не так?
zoul

@zoul Я так не думаю, але не цитуйте мене з цього приводу, оскільки минуло деякий час, оскільки я використовував SVN
Abe Voelker

на жаль, це не торкається не відслідковуваних файлів. спробуй повернути svn -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

1
+1, Це часто єдиний спосіб виправити дивні проблеми, принаймні те, що я знайшов.
Бред

2

Дуже швидко і просто і робить саме те, що ви хочете

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

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

І може бути хорошою ідеєю додати до команди svn --no-ignore


2
Це так жахливо. Що з користувачами Windows? Субверсії, очевидно, потрібно трохи попрацювати, перш ніж її можна сприймати серйозно як інструмент контролю версій.
Warren P

1

Для видалення файлів, що не відслідковуються

Мені вдалося перелічити всі відслідковувані файли, про які повідомляє svn stbash, виконуючи такі дії:

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

Якщо ви відчуваєте себе щасливими, ви можете замінити echoз , rmщоб видалити неотслежіваемих файли. Або скопіюйте файли, які ви хочете видалити вручну, якщо ви відчуваєте себе менш щасливими.


(Я використовував відповідь @ abe-voelker для відновлення решти файлів: https://stackoverflow.com/a/6204601/1695680 )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.