有人知道一种递归删除工作副本中不受版本控制的所有文件的方法吗?(我需要这样做才能在自动构建的VMware中获得更可靠的结果。)
hg purge --all
在Mercurial。
有人知道一种递归删除工作副本中不受版本控制的所有文件的方法吗?(我需要这样做才能在自动构建的VMware中获得更可靠的结果。)
hg purge --all
在Mercurial。
Answers:
编辑:
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年)。它是稳定和标准的。
这对我来说很有效:
svn status | egrep '^\?' | cut -c8- | xargs rm
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
它处理未版本控制的文件夹和文件名中的空格
根据下面的评论,这仅适用于Subversion未知的文件(status =?)。凡是颠覆不知道(包括忽略的文件/文件夹)不会被删除。
如果您使用的是Subversion 1.9或更高版本,则可以简单地将svn cleanup命令与--remove-unversioned和--remove-ignored选项一起使用
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
尽管没有进行自动构建,但我在尝试执行相同操作时浏览了该页面。
经过一番寻找之后,我在TortoiseSVN中发现了“ 扩展上下文菜单 ”。按住Shift键,然后右键单击工作副本。现在,TortoiseSVN菜单下还有其他选项,包括“ 删除未版本化的项目... ”。
尽管可能不适用于该特定问题(例如,在自动构建的范围内),但我认为这可能对其他希望做同样事情的人有所帮助。
如果您使用的是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
只需在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禁用显示清理对话框,用户可以在其中选择在清理中应该执行的操作。可以使用选项/ cleanup来指定可用的操作,以进行状态清除,/ revert,/ delunversioned,/ delignored,/ refreshshell和/ externals。
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
这是一个unix shell命令,用于删除不受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个和n个rm
进程被分叉。
我偶然发现了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个字符,在中没有使用9个字符。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]
,因为D
也会删除受版本控制的已删除文件。我想用它来建立一个干净的,已签入的文件夹,所以D
状态下应该没有文件。
对于喜欢使用perl而不是python,Unix shell,java等的人。特此使用一个小型的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循环中定义vars的问题。
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