У мене працює робочий каталог SVN. Я вніс деякі зміни в цей каталог, і він відображається в svn status
. Але чи є для мене можливість видалити всі мої зміни там і просто отримати все з магістралі за допомогою командного рядка?
У мене працює робочий каталог SVN. Я вніс деякі зміни в цей каталог, і він відображається в svn status
. Але чи є для мене можливість видалити всі мої зміни там і просто отримати все з магістралі за допомогою командного рядка?
Відповіді:
svn revert -R .
svn up
Це рекурсивно поверне поточний каталог і все під ним, а потім оновить до останньої версії.
Я використовував комбінацію відповідей інших людей, щоб придумати це рішення:
svn revert -R .
svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf
svn update --force
svn revert -R .
svn cleanup . --remove-unversioned
svn cleanup . --remove-ignored
Якщо у вас немає змін, ви завжди можете бути дуже ретельними і / або ледачими і робити ...
rm -rf *
svn update
Але, ні, насправді, не робіть цього, якщо ви справді не впевнені, що параметр "нукери з космосу" - це те, що ви хочете !! Це має перевагу також у тому, що знімає всі сурові, тимчасові файли та речі, які SVN ігнорує.
Більш правильне рішення - використовувати команду повернення:
svn revert -R .
-R призводить до того, що субверсія повторюється і повертає все в поточну робочу директорію і нижче.
svn nuke-from-space
Жодна з відповідей тут була зовсім не такою, яку я хотів. Ось що я придумав:
# 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
.
Якщо ви перебуваєте у вікні, наступне для циклу скасує всі невідомі зміни, внесені до вашої робочої області:
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"
)