Як я можу видалити всі зміни в робочому каталозі SVN?


195

У мене працює робочий каталог SVN. Я вніс деякі зміни в цей каталог, і він відображається в svn status. Але чи є для мене можливість видалити всі мої зміни там і просто отримати все з магістралі за допомогою командного рядка?

Відповіді:


274
svn revert -R .
svn up

Це рекурсивно поверне поточний каталог і все під ним, а потім оновить до останньої версії.


2
Зауважте, що це не працює із зовнішніми сторонами (вони, здавалося б, ігноруються).
cic

86

Я використовував комбінацію відповідей інших людей, щоб придумати це рішення:

Відновити нормальні локальні зміни SVN

svn revert -R .

Видаліть будь-які інші зміни та підтримує видалення файлів / папок з пробілами тощо.

svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf

Не забудьте отримати останні файли від SVN

svn update --force

Велике спасибі Shaize, це найелегантніша седа, ... труба, яку я бачив до цього часу :) Особливо дбаючи і про ігнори.
хуліган

Працює як шарм. Дякую!
Найло Кейненен

28
svn revert -R .
svn cleanup . --remove-unversioned

Він не видаляє * .class файлів і т.д.
Трисмегист

2
якщо ви також хочете видалити проігноровані файлиsvn cleanup . --remove-ignored
Kip

14

Якщо у вас немає змін, ви завжди можете бути дуже ретельними і / або ледачими і робити ...

rm -rf *
svn update

Але, ні, насправді, не робіть цього, якщо ви справді не впевнені, що параметр "нукери з космосу" - це те, що ви хочете !! Це має перевагу також у тому, що знімає всі сурові, тимчасові файли та речі, які SVN ігнорує.

Більш правильне рішення - використовувати команду повернення:

svn revert -R .

-R призводить до того, що субверсія повторюється і повертає все в поточну робочу директорію і нижче.


Я часто використовував цей трюк, але за допомогою SVN 1.7, де метадані зберігаються лише у кореневій кімнаті WC, це вже не чисте рішення, яким воно було. Наприклад, видалені файли залишаються видаленими.
Барт ван Хекелом

8
svn nuke-from-space
Jason Swett

9

Жодна з відповідей тут була зовсім не такою, яку я хотів. Ось що я придумав:

# Recursively revert any locally-changed files
svn revert -R .

# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
    perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
    tr '\n' '\0' | xargs -0 rm -rf

Тестовано на Linux; може працювати в Cygwin, але покладається на (я вважаю) розширення, характерне для GNU, яке дозволяє розділити xargs на основі '\0'замість пробілу.

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

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

Редагувати : Я не впевнений, що це працює з усіма версіями Subversion. Не ясно, чи svn statusкоманда завжди форматується послідовно. Використовуйте на свій страх і ризик, як і будь-яку команду, яка використовує таку ковдру rm.


7

повернення svn скасує будь-які внесені вами локальні зміни


5

Ви можете скористатися такою командою для відновлення всіх локальних змін:

svn st -q | awk '{print $2;}' | xargs svn revert

Я отримую повідомлення про помилку "Не достатньо аргументів" для відновлення svn
циркуляр

4
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

Видалить будь-який файл, який був змінений. Здається, пам’ятаю, що виникли проблеми з відновленням, коли файли та каталоги, можливо, були додані.



0

Якщо ви перебуваєте у вікні, наступне для циклу скасує всі невідомі зміни, внесені до вашої робочої області:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)

Якщо ви хочете видалити всі недозволені зміни та всі неперевершені об’єкти, знадобиться 2 петлі:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
  svn rm --force "%%e"
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.