web-dev-qa-db-ja.com

Subversionのバージョン管理外のファイルを自動的に削除する

バージョン管理下にない作業コピーのすべてのファイルを再帰的に削除する方法を知っている人はいますか? (VMwareの自動ビルドでより信頼性の高い結果を得るには、これが必要です。)

108
Stefan Schultze

編集:

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))

それはかなりうまくやっているようです。

23
Thomas Watnedal

これは私にとってbashで動作します:

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

Seth Reno の方が優れています:

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

バージョン管理されていないフォルダとファイル名のスペースを処理します

以下のコメントによると、これはSubversionが認識しないファイル(status =?)でのみ機能します。 Subversionが行うことが知っているもの(無視されたファイル/フォルダーを含む)は削除されません。

Subversion 1.9以降を使用している場合は、単に--remove-unversionedオプションと--remove-ignoredオプションを指定して svn cleanup コマンドを使用できます。

138
Ken

自動ビルド用ではありませんが、同じことをしようとしているときにこのページを見つけました。

もう少し見てみると、TortoiseSVNで「拡張コンテキストメニュー」が見つかりました。 Shiftキーを押しながら作業コピーを右クリックします。 TortoiseSVNメニューの下に、「バージョン管理外のアイテムを削除...」などの追加オプションが追加されました。

この特定の質問には適用されないかもしれませんが(つまり、自動化されたビルドのコンテキスト内で)、同じことをしようとしている他の人にとっては役立つと思いました。

71
g .

参照: svn-clean

19
Martin

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"
9
Sukesh Nambiar

これをWindows PowerShellプロファイルに追加しました

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
7
Kyle

Linuxコマンドライン:

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

または、ファイルの一部がルートによって所有されている場合:

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

これはケンの答えに基づいています。 (ケンの答えは無視されたファイルをスキップします;私の答えはそれらを削除します)。

5
user9876

Unix-Shellで次のようにしてください:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
4
bruziuz

パスに TortoiseSVN があり、正しいディレクトリにいる場合:

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

オプションは、/command:cleanupのTortoiseSVNヘルプで説明されています。

/ nouiを使用して、結果ダイアログにポップアップが表示されないようにし、クリーンアップが終了したことを通知するか、エラーメッセージを表示します。/noprogressuiは、進行状況ダイアログも無効にします。/nodlgは、クリーンアップダイアログを表示しないようにします。このダイアログでは、ユーザーはクリーンアップで正確に実行する操作を選択できます。使用可能なアクションは、ステータスのクリーンアップ、/ revert、/ delunversioned、/ delignored、/ refreshshell、および/ externalsのオプション/ cleanupで指定できます。

4
stevek_mcc

新しい場所にエクスポートしてそこからビルドすることはできませんか?

4
leppie

Thomas WatnedalsのC#変換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();
    }
}
3
Stefan Schultze

カメsvnを使用している場合、これを行うための隠しコマンドがあります。 Shiftキーを押しながらフォルダーを右クリックして、Windowsエクスプローラーのコンテキストメニューを起動します。 「バージョン管理外アイテムの削除」コマンドが表示されます。

詳細については、この下を参照してください ページ 、または下のスクリーンショットでは、緑色の星で拡張された機能を強調表示し、黄色の長方形で関心のあるものを強調しています...

SVN Extended context menu vs standard menu

3
rob bentley

Subversion 1.9.0では、バージョン管理外のアイテムを削除するオプションが導入されました[1]

svn cleanup --remove-unversioned

[1] https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-cleanup-options

3
Ivan Zhakov
svn st --no-ignore  | grep '^[?I]' | sed 's/^[?I]  *//' | xargs -r -d '\n' rm -r

これは、Subversionの制御下にないすべてのファイルを削除するUNIXシェルコマンドです。

ノート:

  • svn stststatusの組み込みエイリアスです。つまり、コマンドはsvn statusと同等です。
  • --no-ignoreにはステータス出力に非リポジトリファイルも含まれます。そうでない場合は、.cvsignoreなどのメカニズムを介して無視されます。目的はビルドのクリーンな開始点を持つことであるため、このスイッチは必須です
  • grepは、Subversionに未知のファイルのみが残るように出力をフィルタリングします-?で始まる行は、--no-ignoreオプションなしでは無視されるSubversionに未知のファイルをリストします
  • ファイル名までのプレフィックスはsedを介して削除されます
  • 引数リストが空の場合、xargsコマンドは-rを介してrmを実行しないように指示されます。
  • -d '\n'オプションは、区切り文字として改行を使用するようxargsに指示します。このようなコマンドは、スペースを含むファイル名でも機能します
  • rm -rは、完全なディレクトリ(リポジトリの一部ではない)を削除する必要がある場合に使用されます
3
maxschlepzig

他のみんながやっているので...

svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
2
josh-cain

Win32の自動ビルドシステムに追加する必要がなかった追加の依存関係なしでは、上記のいずれも機能しませんでした。そこで、以下のAntコマンドをまとめました。これらにはAnt-contrib JARをインストールする必要があることに注意してください(Ant 1.7.0で最新のバージョン1.0b3を使用していました)。

これは警告なしでバージョン管理外のファイルをすべて削除することに注意してください。

  <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 &quot;${basedir}&quot;" 
                       outputProperty="status" />
    <echo message="Deleting any unversioned files:" />
    <for list="${status}" param="p" delimiter="&#x0a;" 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>

別のフォルダーの場合は、${basedir} 参照。

2
Steve
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

実行したいことが確実な場合は、エコーを削除してください。

2
Aria

純粋なWindows cmd/batソリューション:

@echo off

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
if "%1"=="%~nx0" goto :eof
IF EXIST "%1\*" ( 
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
1
Andriy F.

RH5マシンでsvn-cleanを見つけました。/usr/bin/svn-cleanにあります

http://svn.Apache.org/repos/asf/Subversion/trunk/contrib/client-side/svn-clean

1
Eric Cope

Seth Reno's version from this answer を試しましたが、うまくいきませんでした。 cut -c9-で使用される9文字ではなく、ファイル名の前に8文字があります。

したがって、これはsedではなくcutを使用した私のバージョンです。

svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
1
nkoder

Powershellでクールな場合:

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

-WhatIfフラグを削除して、コマンドに実際に削除を実行させます。それ以外の場合は、-WhatIfを指定せずに実行すると、出力されますwouldを実行します。

1
Giscard Biamby

@zhoufei私はあなたの答えをテストし、ここに更新されたバージョンがあります:

FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO del /s /f /q "%%H"
FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO rd /s /q "%%H"
  • GとHの前に2つの%マークを使用する必要があります
  • 順序を切り替える:最初にすべてのファイルを削除してから、すべてのディレクトリを削除します
  • (オプション:) %~1の代わりに任意のディレクトリ名を使用できます。これをbatファイルの関数として使用したため、%~1が最初の入力パラメーターです
1
Nikola

これを Thomas Watnedalの答え へのコメントとして追加しますが、まだできません。

(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状態のファイルはありません。

1
Michael Firth

別のオプションにも貢献する可能性があります

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/は私自身の目的のためです。

そして、svnコマンドに--no-ignoreを追加することをお勧めします

1
user1299374

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 ()
0
J. T. Marsh

Python、Unix Shell、Javaなどの代わりにPerlでこれを実行したい人のために。これにより、ジブも実行する小さなPerlスクリプト。

注:これにより、バージョン管理外のディレクトリもすべて削除されます

#!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

上記のC#コードスニペットは私にとってはうまくいきませんでした-私はカメのsvnクライアントを持っています、そして行はわずかに異なってフォーマットされます。上記と同じコードsnipetがありますが、関数に書き換えられ、正規表現を使用しています。

        /// <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
TarmoPikaro

また、次を見つけて使用しました:svn status --no-ignore | awk '/ ^?/ {print $ 2}' | xargs rm

0
chataros

コードを書きたくない場合は、 svn2svn のsvn2.exeがこれを行います。また、その実装方法に関する 記事 もあります。削除されたフォルダーとファイルはごみ箱に入れられます。

「svn2.exe sync [path]」を実行します。

0
dB.

ここでは、標準のMS-Dosコマンド以外のツールの使用を避けたいWindowsのユーザー向けのソリューション:

FOR/F "tokens = 1 * delims ="%G IN( 'svn st ^ | findstr "^?"')DO rd/s/q "%H"

FOR/F "tokens = 1 * delims ="%G IN( 'svn st ^ | findstr "^?"')DO del/s/f/q "%H"

  • svn stは、作業コピーの各ファイルとフォルダーのステータスを表示します
  • findstrは、「?」で始まる各行を探します。つまり、ファイル/フォルダーはバージョン管理されていません。
  • FORは区切り文字として使用し、最初のトークン(1番目は%G、残りは%H)の後にトークンを取得します。これにより、svn stコマンドの出力からファイル/フォルダーを抽出します。
  • rdはフォルダーを削除し、delはファイルを削除します。
0
zhoufei

TortoiseSVNの使用:* Shiftキーを押しながら作業コピーフォルダーを右クリック* [バージョン管理外のアイテムを削除]を選択

作業コピーのバージョン管理されていない/無視されたファイル/フォルダーをすべて削除するにはどうすればよいですか?

0
umpirsky

これを生成するのに約3時間使用しました。 Unixでそれを行うには5分かかります。主な問題は、Winフォルダの名前にスペースがあり、%% iを編集できないことと、Win cmdループで変数を定義する問題です。

setlocal enabledelayedexpansion

for /f "skip=1 tokens=2* delims==" %%i in ('svn status --no-ignore --xml ^| findstr /r "path"') do (
@set j=%%i
@rd /s /q !j:~0,-1!
)
0
Ilya Rosman