Редактирование:
Подрывная деятельность 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))
Это, кажется, делает задание вполне прилично.
это работает на меня в ударе:
svn status | egrep '^\?' | cut -c8- | xargs rm
Seth Reno лучше:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Это обрабатывает неимеющие версию папки и пробелы в именах файлов
Согласно комментариям ниже, это только работает над файлами, о которых не знает подрывная деятельность (состояние =?). Что-либо, что подрывная деятельность делает , знает о (включая Проигнорированные файлы/папки), не будет удален.
при использовании подрывной деятельности 1.9 или больше, что можно просто использовать svn очистка , команда с - удаляет - неимеющий версию, и - удаляют - проигнорированные опции
Вы не можете только сделать экспорта в новое местоположение и сборку оттуда?
Мое преобразование C# сценария Thomas Watnedals Python:
Console.WriteLine("SVN cleaning directory {0}", directory);
Directory.SetCurrentDirectory(directory);
var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WorkingDirectory = directory;
using (var process = Process.Start(psi))
{
string line = process.StandardOutput.ReadLine();
while (line != null)
{
if (line.Length > 7)
{
if (line[0] == '?')
{
string relativePath = line.Substring(7);
Console.WriteLine(relativePath);
string path = Path.Combine(directory, relativePath);
if (Directory.Exists(path))
{
Directory.Delete(path, true);
}
else if (File.Exists(path))
{
File.Delete(path);
}
}
}
line = process.StandardOutput.ReadLine();
}
}
I couldn't get any of the above to work without additional dependencies I didn't want to have to add to my automated build system on win32. So I put together the following Ant commands - note these require the Ant-contrib JAR to be installed in (I was using version 1.0b3, the latest, with Ant 1.7.0).
Note this deletes all unversioned files without warning.
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" />
<macrodef name="svnExecToProperty">
<attribute name="params" />
<attribute name="outputProperty" />
<sequential>
<echo message="Executing Subversion command:" />
<echo message=" svn @{params}" />
<exec executable="cmd.exe" failonerror="true"
outputproperty="@{outputProperty}">
<arg line="/c svn @{params}" />
</exec>
</sequential>
</macrodef>
<!-- Deletes all unversioned files without warning from the
basedir and all subfolders -->
<target name="!deleteAllUnversionedFiles">
<svnExecToProperty params="status "${basedir}""
outputProperty="status" />
<echo message="Deleting any unversioned files:" />
<for list="${status}" param="p" delimiter="
" trim="true">
<sequential>
<if>
<matches pattern="\?\s+.*" string="@{p}" />
<then>
<propertyregex property="f" override="true" input="@{p}"
regexp="\?\s+(.*)" select="\1" />
<delete file="${f}" failonerror="true" />
</then>
</if>
</sequential>
</for>
<echo message="Done." />
</target>
For a different folder, change the ${basedir}
reference.
Я наткнулся на эту страницу, пытаясь сделать то же самое, но не для автоматизированной сборки.
Немного посмотрев, я обнаружил ' Расширенное контекстное меню ] 'в TortoiseSVN. Удерживая нажатой клавишу Shift, щелкните правой кнопкой мыши рабочую копию. Теперь в меню TortoiseSVN есть дополнительные параметры, включая « Удалить неверсированные элементы ... ».
Хотя, возможно, это не применимо для этого конкретного вопроса (т.е. в контексте автоматической сборки), я подумал, что это может быть полезно другим, желающим сделать то же самое.
Для людей, которым нравится делать это с помощью perl вместо python, оболочки Unix, java и т. Д. Это небольшой скрипт на perl, который также выполняет jib.
Примечание. удаляет все неверсированные каталоги
#!perl
use strict;
sub main()
{
my @unversioned_list = `svn status`;
foreach my $line (@unversioned_list)
{
chomp($line);
#print "STAT: $line\n";
if ($line =~/^\?\s*(.*)$/)
{
#print "Must remove $1\n";
unlink($1);
rmdir($1);
}
}
}
main();
Если вы используете командную строку 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"
Если вы используете tortoise svn, для этого есть скрытая команда. Удерживая нажатой клавишу Shift, щелкните папку правой кнопкой мыши, чтобы открыть контекстное меню в проводнике Windows. Вы получите команду «Удалить неверсированные элементы».
см. Подробности внизу этой страницы или снимок экрана ниже, на котором расширенные объекты выделены зелеными звездами, а интересующий объект - желтым прямоугольником ...