バージョン管理されていない作業コピー内のすべてのファイルを再帰的に削除する方法を誰かが知っていますか?(自動ビルドVMwareでより信頼性の高い結果を得るには、これが必要です。)
hg purge --all
Mercurialで。
バージョン管理されていない作業コピー内のすべてのファイルを再帰的に削除する方法を誰かが知っていますか?(自動ビルドVMwareでより信頼性の高い結果を得るには、これが必要です。)
hg purge --all
Mercurialで。
回答:
編集:
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))
それはかなりうまくやっているようです。
svn cleanup --remove-unversioned
はより良いです。そしてそれはSubversion 1.9.0用です(このバージョンは2015年のものです)。安定していて標準です。
これは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コマンドを使用できます
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
自動化されたビルドではないが、同じことをしようとしてこのページに出くわした。
もう少し調べた後、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"
これをバッチファイルで使用する場合は、%
次の2倍にする必要があります。
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 } }
}
--no-ignore
にsvn status
して-Recurse
にRemove-Item
unix-shellで次のように実行するだけです。
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
新しい場所にエクスポートして、そこからビルドすることはできませんか?
あなたは持っている場合はTortoiseSVNのをあなたのパスに、あなたは右のディレクトリにあります。
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
オプションはTortoiseSVNヘルプで説明されています/command:cleanup
:
/ nouiを使用して、結果ダイアログがポップアップ表示され、クリーンアップが終了したことを通知したり、エラーメッセージを表示したりしないようにします。/ noprogressuiは、進行状況ダイアログも無効にします。/ nodlgは、ユーザーがクリーンアップで実行する必要があることを正確に選択できるクリーンアップダイアログの表示を無効にします。使用可能なアクションは、ステータスのクリーンアップ、/ revert、/ delunversioned、/ delignored、/ refreshshell、/ externalsのオプション/ cleanupで指定できます。
Subversion 1.9.0では、バージョン管理されていないアイテムを削除するオプションが導入されました[1]
svn cleanup --remove-unversioned
[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Thomas Watnedals PythonスクリプトのC#変換:
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 st --no-ignore | grep '^[?I]' | sed 's/^[?I] *//' | xargs -r -d '\n' rm -r
これは、Subversionの管理下にないすべてのファイルを削除するUNIXシェルコマンドです。
ノート:
st
中には、svn st
ビルドでの別名であるstatus
、すなわちコマンドは同等ですsvn status
--no-ignore
ステータス出力に非リポジトリファイルも含まれます。それ以外の場合は、.cvsignore
などのメカニズムを介して無視されます。ビルドの開始点を明確にすることが目標であるため、このスイッチは必須です。grep
転覆に、このような出力が唯一の未知のファイルフィルタが残っている-行が始まる?
せずに無視されるだろう転覆にリストファイルの不明な--no-ignore
オプションsed
xargs
コマンドを介して、指示され-r
実行されないためにrm
引数リストが空になるとき、-d '\n'
オプションは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)}'
それがあなたがしたいことが確かであるならば、エコーを取り除いてください。
/bin/sh
とn個のrm
プロセスがfork されるため、xargsベースの回答よりも劣ります。
別のオプションも提供する可能性があります
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(config|.ini)/は私自身の目的のためです。
そして、svnコマンドに--no-ignoreを追加することをお勧めします
RH5マシンでsvn-cleanを見つけました。/ usr / bin / svn-cleanにあります
http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
純粋な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
あなたがpowershellでクールなら:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
-WhatIfフラグを削除して、コマンドが実際に削除を実行するようにします。それ以外の場合は、単に出力それがどうなるかを考え実行している場合は-WhatIfなしで行います。
これをトーマス・ワトネダルの回答へのコメントとして追加します、まだできません。
(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
状態にファイルはありません。
@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
、最初の入力パラメーターpython、Unix shell、javaなどの代わりにperlでこれを行うのが好きな人向け。これにより、jibも実行する小さな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();
TortoiseSVNの使用:* Shiftキーを押しながら作業コピーフォルダーを右クリック* [バージョン管理外のアイテムを削除]を選択
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 ()
これを生成するのに約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!
)
上記の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