Автоматически удалять неверсированные файлы Subversion - PullRequest
108 голосов
/ 27 октября 2008

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

Ответы [ 32 ]

138 голосов
/ 27 октября 2008

у меня это работает в bash:

 svn status | egrep '^\?' | cut -c8- | xargs rm

Сет Рено лучше:

svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r 

Обрабатывает неверсионные папки и пробелы в именах файлов

Согласно комментариям ниже, это работает только с файлами, о которых Subversion не знает (status =?). Все, что знает Subversion * (включая игнорируемые файлы / папки), не будет удалено.

Если вы используете Subversion 1.9 или выше, вы можете просто использовать команду svn cleanup с параметрами --remove-unversioned и --remove-ignore

71 голосов
/ 30 июня 2009

Я перебрал эту страницу, пытаясь сделать то же самое, но не для автоматической сборки.

После нескольких поисков я обнаружил расширенное контекстное меню 1004 * в TortoiseSVN. Удерживая клавишу Shift, щелкните правой кнопкой мыши на рабочей копии. Теперь в меню TortoiseSVN есть дополнительные параметры, включая « Удалить неверсионные элементы ... ».

Хотя, возможно, это не относится к этому конкретному вопросу (т. Е. В контексте автоматической сборки), я подумал, что это может быть полезно для других, желающих сделать то же самое.

22 голосов
/ 27 октября 2008

Edit:

В Subversion 1.9.0 появилась возможность сделать это:

svn cleanup --remove-unversioned

До этого я использую этот скрипт на python:

import os
import re

def removeall(path):
    if not os.path.isdir(path):
        os.remove(path)
        return
    files=os.listdir(path)
    for x in files:
        fullpath=os.path.join(path, x)
        if os.path.isfile(fullpath):
            os.remove(fullpath)
        elif os.path.isdir(fullpath):
            removeall(fullpath)
    os.rmdir(path)

unversionedRex = re.compile('^ ?[\?ID] *[1-9 ]*[a-zA-Z]* +(.*)')
for l in  os.popen('svn status --no-ignore -v').readlines():
    match = unversionedRex.match(l)
    if match: removeall(match.group(1))

Кажется, она хорошо справляется с работой.

19 голосов
/ 24 ноября 2009

См .: svn-clean

9 голосов
/ 01 октября 2009

Если вы находитесь в командной строке Windows,

for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i

Улучшенная версия:

for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"

Если вы используете это в пакетном файле, вам нужно удвоить %:

for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
7 голосов
/ 31 августа 2011

Я добавил это в свой профиль Windows PowerShell

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
5 голосов
/ 24 мая 2011

Командная строка Linux:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r

Или, если некоторые из ваших файлов принадлежат пользователю root:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r

Это основано на ответе Кена. (Ответ Кена пропускает пропущенные файлы; мой ответ удаляет их).

4 голосов
/ 05 июля 2013

Просто сделайте это на unix-shell с помощью:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
4 голосов
/ 15 сентября 2016

Если у вас TortoiseSVN на вашем пути, и вы находитесь в правильном каталоге:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

Опции описаны в справке TortoiseSVN для /command:cleanup:

Используйте / noui, чтобы предотвратить появление диалогового окна с результатами. либо рассказывает о завершении очистки, либо показывает ошибку сообщение). / noprogressui также отключает диалог прогресса. / nodlg отключает показ диалогового окна очистки, где пользователь может выбрать, что точно должно быть сделано в уборке. Доступные действия могут быть указывается в параметрах / cleanup для очистки статуса, / revert, / delunversioned, / delignored, / refreshshell и /externals.

4 голосов
/ 27 октября 2008

Разве вы не можете просто сделать экспорт в новое место и построить оттуда?

...