Windows 如何判断SVN工作副本中的所有目录都指向同一个存储库根? 我们最近有一个问题,TurtoSevn或AkHSvnI不能确定在切换一个SvN工作副本时发生了什么故障。我们的开发人员没有意识到交换机是不完整的,一切都很好,直到将分支合并回主干,在那里我们了解到一些更改已经提交到主干,一些更改已经提交到分支

Windows 如何判断SVN工作副本中的所有目录都指向同一个存储库根? 我们最近有一个问题,TurtoSevn或AkHSvnI不能确定在切换一个SvN工作副本时发生了什么故障。我们的开发人员没有意识到交换机是不完整的,一切都很好,直到将分支合并回主干,在那里我们了解到一些更改已经提交到主干,一些更改已经提交到分支,windows,svn,version-control,tortoisesvn,Windows,Svn,Version Control,Tortoisesvn,幸运的是,这实际上并没有影响任何事情,但我担心这种情况将来可能再次发生,我需要一种快速的方法来测试工作副本中的子目录指向哪个存储库。现在,在Linux中,我可以很快地一起破解一个shell脚本来确定这一点,但我目前不知道如何在Windows中找到这一点 如果必须的话,我并不完全反对使用SharpSVN一起进行黑客攻击,如果我这样做了,请放心,我会与大家分享,但我想知道我是否可以通过使用一些内置的OrtoiseSvn或AnkhSVN功能来为我节省一些时间。如果您可以使用Powershell,请使用

幸运的是,这实际上并没有影响任何事情,但我担心这种情况将来可能再次发生,我需要一种快速的方法来测试工作副本中的子目录指向哪个存储库。现在,在Linux中,我可以很快地一起破解一个shell脚本来确定这一点,但我目前不知道如何在Windows中找到这一点


如果必须的话,我并不完全反对使用SharpSVN一起进行黑客攻击,如果我这样做了,请放心,我会与大家分享,但我想知道我是否可以通过使用一些内置的OrtoiseSvn或AnkhSVN功能来为我节省一些时间。

如果您可以使用Powershell,请使用以下内容:

gci -Recurse | ?{ $_.psIsContainer -eq $true} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:"
对于工作副本中的每个文件夹,它将显示repo中的路径和url。如果某个文件夹切换到某个分支,则可以看到该url和路径

您可以轻松调整它,只打印当前分支或主干之外的路径和URL

忽略未设置版本的文件夹很容易:

(svn status $_.fullname) -notmatch "\?")
因此,整个事情将是:

gci | ?{ $_.psIsContainer -eq $true -and ((svn status $_.fullname) -notmatch "\?")} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:"

您需要有一个命令行svn客户端,如SlikSVN或CollabnetSVN和on-path。

如果您可以在linux中生成脚本,您可能希望将cygwin放在客户端上,以便可以访问bash脚本。或者perl,因为他们有自己的windows安装。UnxUtils也很不错。

@manojlds的答案很合理,但我的测试很快发现了一些问题。首先,虽然它正确地过滤掉了作为直接子项的非SVN文件夹,但它不处理子项。svn status命令会使用“非工作副本”消息阻止此类项。记住Get ChildItem不会因为文件夹不是Subversion文件夹而停止从文件夹向下跳转;它注意到了这一事实,但仍在继续挖掘,因此您还必须处理后代

接下来,svn info命令阻止被忽略的项目,即投诉为“非版本化资源”的文件夹的svn:ignore属性

最后,它可能过滤掉太多:它依赖于svn状态输出一行,该行以问号开头,表示未版本化,当且仅当指定的文件夹实际上未版本化。但是,由于文件夹上的svn状态包括其所有子体,因此,如果版本化文件夹的任何子体项文件或文件夹处于未版本化状态,则svn状态将包括未版本化状态指示符,即问号,从而导致条件设置错误地跳过版本化文件夹。图中的顶部窗格显示,如果没有未版本化的子代,则根的两个子级都报告正常状态。将Resources文件夹添加为未版本化的子体底部窗格后,来自svn状态的报告现在包括未版本化的子级

使用Get-EnhancedChildItem可以获得更好的解决方案,Get-EnhancedChildItem是一个cmdlet,可从my的开源CleanCode库中获得,打开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) { $_ }
}

差不多到了,当我知道如何将目录与当前根目录进行比较,并忽略未版本目录时,我将编辑您的帖子。@Raskolnikov-我已更新以过滤未版本的FoldersHanks,我使用win32svn获得了这篇文章-非常感谢您的回复,尽管主题已经过时。我实际上不再使用SVN了,因为我已经被Mercurial的甜美的警报声吸引走了,这种情况是不会发生的,但是你的回答似乎很有帮助。希望这将有助于其他人谁是希望解决这个问题。