누구든지 버전 제어를받지 않는 작업 복사본의 모든 파일을 재귀 적으로 제거하는 방법을 알고 있습니까? (자동 빌드 VMware에서 더 안정적인 결과를 얻으려면 이것이 필요합니다.)
hg purge --all
Mercurial에서.
누구든지 버전 제어를받지 않는 작업 복사본의 모든 파일을 재귀 적으로 제거하는 방법을 알고 있습니까? (자동 빌드 VMware에서 더 안정적인 결과를 얻으려면 이것이 필요합니다.)
hg purge --all
Mercurial에서.
답변:
편집하다:
Subversion 1.9.0은이를위한 옵션을 도입했습니다 :
svn cleanup --remove-unversioned
그 전에이 파이썬 스크립트를 사용하여 다음을 수행합니다.
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"
이것을 배치 파일에서 사용하는 경우 다음을 두 배로 늘려야합니다 %
.
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
다음을 사용하여 유닉스 쉘에서 수행하십시오.
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 제어하에 있지 않은 모든 파일을 삭제하는 유닉스 쉘 명령입니다.
노트:
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을 설치해야합니다 (최신 버전 인 1.0b3, Ant 1.7.0을 사용했습니다).
이렇게하면 경고없이 버전이 지정되지 않은 모든 파일이 삭제됩니다.
<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
프로세스가 분기 되기 때문에 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
이 답변 에서 Seth Reno의 버전을 시도했지만 저에게 효과가 없었습니다. 나는 파일 이름 앞에 8자를 사용했으며 .cut -c9-
그래서 이것은 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없이 실행할 경우 수행 할 작업을 출력합니다 .
나는 이것을 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]
는 AS, 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 앞에 두 개의 표시를 사용해야합니다.%~1
어떤 디렉토리 이름도 사용할 수 있습니다. 저는 이것을 bat 파일의 함수로 사용 했으므로 %~1
첫 번째 입력 매개 변수입니다.코드를 작성하고 싶지 않다면 svn2svn의 svn2.exe가이 작업을 수행 하며 구현 방법에 대한 기사 도 있습니다 . 삭제 된 폴더와 파일은 휴지통에 보관됩니다.
"svn2.exe sync [path]"를 실행합니다.
파이썬, 유닉스 쉘, 자바 등 대신에 펄로 이것을하기를 좋아하는 사람들을 위해. 이로써 지브도 수행하는 작은 펄 스크립트가있다.
참고 : 이렇게하면 버전이 지정되지 않은 모든 디렉토리도 제거됩니다.
#!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 ()
위의 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