バージョン管理下にない作業コピーのすべてのファイルを再帰的に削除する方法を知っている人はいますか? (VMwareの自動ビルドでより信頼性の高い結果を得るには、これが必要です。)
編集:
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))
それはかなりうまくやっているようです。
これは私にとって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 コマンドを使用できます。
自動ビルド用ではありませんが、同じことをしようとしているときにこのページを見つけました。
もう少し見てみると、TortoiseSVNで「拡張コンテキストメニュー」が見つかりました。 Shiftキーを押しながら作業コピーを右クリックします。 TortoiseSVNメニューの下に、「バージョン管理外のアイテムを削除...」などの追加オプションが追加されました。
この特定の質問には適用されないかもしれませんが(つまり、自動化されたビルドのコンテキスト内で)、同じことをしようとしている他の人にとっては役立つと思いました。
参照: svn-clean
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"
これをWindows PowerShellプロファイルに追加しました
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
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
これはケンの答えに基づいています。 (ケンの答えは無視されたファイルをスキップします;私の答えはそれらを削除します)。
Unix-Shellで次のようにしてください:
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
パスに TortoiseSVN があり、正しいディレクトリにいる場合:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
オプションは、/command:cleanup
のTortoiseSVNヘルプで説明されています。
/ nouiを使用して、結果ダイアログにポップアップが表示されないようにし、クリーンアップが終了したことを通知するか、エラーメッセージを表示します。/noprogressuiは、進行状況ダイアログも無効にします。/nodlgは、クリーンアップダイアログを表示しないようにします。このダイアログでは、ユーザーはクリーンアップで正確に実行する操作を選択できます。使用可能なアクションは、ステータスのクリーンアップ、/ revert、/ delunversioned、/ delignored、/ refreshshell、および/ externalsのオプション/ cleanupで指定できます。
新しい場所にエクスポートしてそこからビルドすることはできませんか?
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();
}
}
カメsvnを使用している場合、これを行うための隠しコマンドがあります。 Shiftキーを押しながらフォルダーを右クリックして、Windowsエクスプローラーのコンテキストメニューを起動します。 「バージョン管理外アイテムの削除」コマンドが表示されます。
詳細については、この下を参照してください ページ 、または下のスクリーンショットでは、緑色の星で拡張された機能を強調表示し、黄色の長方形で関心のあるものを強調しています...
Subversion 1.9.0では、バージョン管理外のアイテムを削除するオプションが導入されました[1]
svn cleanup --remove-unversioned
[1] https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-cleanup-options
svn st --no-ignore | grep '^[?I]' | sed 's/^[?I] *//' | xargs -r -d '\n' rm -r
これは、Subversionの制御下にないすべてのファイルを削除するUNIXシェルコマンドです。
ノート:
svn st
のst
はstatus
の組み込みエイリアスです。つまり、コマンドはsvn status
と同等です。--no-ignore
にはステータス出力に非リポジトリファイルも含まれます。そうでない場合は、.cvsignore
などのメカニズムを介して無視されます。目的はビルドのクリーンな開始点を持つことであるため、このスイッチは必須ですgrep
は、Subversionに未知のファイルのみが残るように出力をフィルタリングします-?
で始まる行は、--no-ignore
オプションなしでは無視されるSubversionに未知のファイルをリストしますsed
を介して削除されますxargs
コマンドは-r
を介してrm
を実行しないように指示されます。-d '\n'
オプションは、区切り文字として改行を使用するようxargs
に指示します。このようなコマンドは、スペースを含むファイル名でも機能しますrm -r
は、完全なディレクトリ(リポジトリの一部ではない)を削除する必要がある場合に使用されます他のみんながやっているので...
svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
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 "${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>
別のフォルダーの場合は、${basedir}
参照。
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
実行したいことが確実な場合は、エコーを削除してください。
純粋な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
RH5マシンでsvn-cleanを見つけました。/usr/bin/svn-cleanにあります
http://svn.Apache.org/repos/asf/Subversion/trunk/contrib/client-side/svn-clean
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
Powershellでクールな場合:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
-WhatIfフラグを削除して、コマンドに実際に削除を実行させます。それ以外の場合は、-WhatIfを指定せずに実行すると、出力されますwouldを実行します。
@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"
%
マークを使用する必要があります%~1
の代わりに任意のディレクトリ名を使用できます。これをbatファイルの関数として使用したため、%~1
が最初の入力パラメーターですこれを 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
状態のファイルはありません。
別のオプションにも貢献する可能性があります
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(config|.ini)/は私自身の目的のためです。
そして、svnコマンドに--no-ignoreを追加することをお勧めします
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 ()
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();
上記の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
また、次を見つけて使用しました:svn status --no-ignore | awk '/ ^?/ {print $ 2}' | xargs rm
ここでは、標準の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"
TortoiseSVNの使用:* Shiftキーを押しながら作業コピーフォルダーを右クリック* [バージョン管理外のアイテムを削除]を選択
これを生成するのに約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!
)