@manojlds答案是相当合理的,但我的测试很快显示出一些问题。首先,虽然它正确地过滤掉了非SVN文件夹,但是它不是,而是处理孙子。 svn status
命令在这样的项目上有一个“不是工作副本”消息。请记住,Get-ChildItem不会因为文件夹不是Subversion文件夹而停止从文件夹下潜;它注意到这个事实,但继续挖掘,所以你也必须处理后代。
接着,在忽略项svn info
命令梁木(即上的文件夹的属性svn:ignore
)该投诉“不是一个版本资源”。
最后,它可以过滤掉太多:它是依靠svn status
输出一个问号开头的行(表示未版本控制)当且仅当指定的文件夹实际上是在未版本控制。然而,由于svn status
一个文件夹包括其后代的所有,如果任何后代项的版本控制目录未受版本控制(文件或文件夹),svn status
包括无版本状态指示灯,问号,引起版本的文件夹,然后被条件错误地忽略。图中的顶部窗格显示,如果没有未受版本控制的后代,则根的两个孩子都会报告正常状态。在将资源文件夹添加为未版本控制的后代(底部窗格)后,svn status
中的报告现在包含未版本控制的子代。
一个更好的解决方案可实现GET-EnhancedChildItem,可从我的开源CleanCode库(cmdlet的从我的API bookshelf,开辟文档PowerShell的音量,或者去下载链接获取代码)。这种增强GET-ChildItem已经知道如何分离版本的文件,以及如何只注重文件夹,所以你必须编写的代码要简单得多(再加上它不会从上述缺点):
Get-EnhancedChildItem -Svn -Recurse -ContainersOnly |
% {svn info $_.fullname} |
select-string -Pattern "^(PATH|URL):"
的–ContainersOnly
选项使该过滤器隔离文件夹,就像前面的代码所做的:
filter FilterContainersOnly()
{
if ($_.PSIsContainer) { $_ }
}
的–Svn
选项启用此过滤器可以解决前面的代码的不足之处:
filter FilterSvn()
{
# Check just the current item (depth => empty);
# force it to report even if up-to-date (verbose => true); and
# wrap stderr into stdout (2>&1) for the next step.
$svnStatus = (svn status --verbose --depth empty $_.fullname 2>&1)
# Item is non-Svn with status of "?" (unversioned) or "I" (ignored).
# Descendants, which are still traversed, cause "svn status" to fail,
# and those of course are also non-Svn.
$svnFilter = ($svnStatus -notmatch "^[?I]|is not a working copy")
if ($svnFilter) { $_ }
}
几乎在那里,当我想出如何将目录与当前根进行比较并忽略未版本化的目录时,我将编辑您的文章。 – 2011-06-14 16:39:53
@Raskolnikov - 我已经更新过滤出未版本控制的文件夹 – manojlds 2011-06-14 17:09:48
谢谢,我与win32svn一起工作 - http://sourceforge.net/projects/win32svn/ – 2011-06-16 08:32:03