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

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

Ответы [ 32 ]

1 голос
/ 30 января 2014

Я попробовал версию Сета Рено от этот ответ , но у меня это не сработало. У меня было 8 символов перед именем файла, а не 9 использованных в cut -c9-.

Так что это моя версия с sed вместо cut:

svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
1 голос
/ 18 апреля 2012

Я наткнулся на svn-clean на моей машине RH5. Он расположен в / usr / bin / svn-clean

http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean

1 голос
/ 06 февраля 2015

Если вы круты с PowerShell:

svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }

Снимите флаг -WhatIf, чтобы команда фактически выполняла удаление. В противном случае он просто выдаст то, что сделает , если будет работать без -WhatIf.

1 голос
/ 26 мая 2017

Я бы добавил это как комментарий к ответу Томаса Ватнедала , но пока не могу.

Незначительная проблема (которая не повлияет на Windows) заключается в том, что она проверяет только файлы или каталоги. Для Unix-подобных систем, где могут присутствовать символические ссылки, необходимо изменить строку:

if os.path.isfile(fullpath):

до

if os.path.isfile(fullpath) or os.path.islink(fullpath):

также для удаления ссылок.

Для меня изменение последней строки if match: removeall(match.group(1)) на

    if match:
        print "Removing " + match.group(1)
        removeall(match.group(1))

, чтобы отображать то, что он удалял, тоже было полезно.

В зависимости от варианта использования часть регулярного выражения ?[\?ID] может быть лучше, чем ?[\?I], поскольку D также удаляет удаленные файлы, которые находились под контролем версий. Я хочу использовать это для создания чистой, проверенной папки, поэтому не должно быть файлов в состоянии D.

0 голосов
/ 15 января 2018

Я также нашел и использовал следующее: svn status --no-ignore | awk '/ ^? / {print $ 2}' | xargs rm

0 голосов
/ 02 ноября 2010

Если вы не хотите писать код, svn2.exe из svn2svn делает это, также есть статья о том, как это реализовано. Удаленные папки и файлы помещаются в корзину.

Запустите "svn2.exe sync [путь]".

0 голосов
/ 13 июля 2015

Для людей на окнах, которые хотят избежать использования какого-либо инструмента, кроме стандартных команд MS-Dos, вот решение:

FOR / F "токены = 1 * delims ="% G IN ('svn st ^ | findstr "^?"') DO rd / s / q "% H"

FOR / F "токены = 1 * delims ="% G IN ('svn st ^ | findstr "^?"') DO del / s / f / q "% H"

  • svn st будет отображать состояние всех файлов и папок в рабочей копии
  • findstr будет искать каждую строку, начинающуюся с '?', Что означает, что файл / папка не версионные
  • FOR будет использовать в качестве разделителей и брать токены после 1-го (1-й -% G, остальное -% H) Таким образом, мы извлекаем файл / папку из вывода команды svn st.
  • rd удалит папки, del удалит файлы.
0 голосов
/ 18 августа 2014

Вышеприведенный фрагмент кода C # у меня не сработал - у меня есть svn клиент черепахи, и строки отформатированы немного по-другому. Вот тот же фрагмент кода, что и выше, только переписанный для работы и использующий регулярное выражение.

        /// <summary>
    /// Cleans up svn folder by removing non committed files and folders.
    /// </summary>
    void CleanSvnFolder( string folder )
    {
        Directory.SetCurrentDirectory(folder);

        var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.WorkingDirectory = folder;
        psi.CreateNoWindow = true;

        using (var process = Process.Start(psi))
        {
            string line = process.StandardOutput.ReadLine();
            while (line != null)
            {
                var m = Regex.Match(line, "\\? +(.*)");

                if( m.Groups.Count >= 2 )
                {
                    string relativePath = m.Groups[1].ToString();

                    string path = Path.Combine(folder, relativePath);
                    if (Directory.Exists(path))
                    {
                        Directory.Delete(path, true);
                    }
                    else if (File.Exists(path))
                    {
                        File.Delete(path);
                    }
                }
                line = process.StandardOutput.ReadLine();
            }
        }
    } //CleanSvnFolder
0 голосов
/ 31 июля 2009

Для людей, которым нравится делать это с помощью 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();
0 голосов
/ 31 июля 2013

Чистый способ сделать это в PERL будет:

#!/usr/bin/perl
use IO::CaptureOutput 'capture_exec'

my $command = sprintf ("svn status --no-ignore | grep '^?' | sed -n 's/^\?//p'");

my ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
my @listOfFiles = split ( ' ', $stdout );

foreach my $file ( @listOfFiles )
{ # foreach ()
    $command = sprintf ("rm -rf %s", $file);
    ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
} # foreach ()
...