我有 Windows XP。我想升级我的TortoiseSVN to version 1.7 。 为此,我需要确保可以在我的 PC 上找到所有 SVN 工作副本。这样它们就可以更新。
我找到了similar question但它是 Powershell 特有的。所以,我想知道是否有一个更通用的解决方案来查找 Win XP 上的所有“SVN 工作副本”。
如果我知道 Windows 上“linux find”的等效项,我可能可以自己编写它。 但我希望可能已经有一个 bash 脚本(或者可能是一些更简单的解决方案)供我和其他人使用。
- 扫描计算机
- 如果找到包含名为“.svn”的目录的目录
- 呼应这个名字,并且
- 不再搜索该目录
最佳答案
一旦您拥有 powershell,我就可以提供完整的脚本以将工作副本升级到 1.7
$prev = "^$"
$workingCopies = Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false} |%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}
foreach($copy in $workingCopies)
{
&"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}
我对“系统卷”目录的访问权限没有问题(这只是意外,因为我将所有源存储在一个我拥有完全权限的文件夹中..)。 至于您的执行策略问题 - 这里有一个很好的技巧来避免来回设置它。 您可以使用特殊选项运行 powershell,以避免执行策略、用户特定配置文件设置(可能因不同原因而损坏)等问题:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Unrestricted -File “C:\Projects\ConvertSvnToVersion17.ps1”
我还可以澄清这个脚本到底做什么(如果您有兴趣):
$prev = "^$"
将 $prev 初始化为空匹配正则表达式 - ^$ 永远不会匹配任何含义值(除了 startline-endline)。这是通过初步检查所必需的
Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\"
从路径开始,递归地获取名称为“.svn”的所有对象(在我们的例子中 - 名称为“.svn”的所有文件和文件夹)。 并将其传送到下一个构造:
?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}
?{...statements... } 是“Where-Object”cmdlet 的快捷方式,$_ 是寻址管道中“每个”条目的方式。 它可以被重写为类似于
foreach($entry in $entriesFromSomewhere)
{
If($entry.PSIsContainer -eq $true -and $entry.Fullname.StartsWith($prev) -eq $false)
{
"If entry is directory" and "fullname not start with value from $prev"
...Pass entry to next construct...
}
}
但为了简洁起见,我将其写为一行
%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}
%{} 是 Foreach 的快捷方式 =) 这个构造做了两件事:
- 将不带“.svn”尾部的文件夹全名分配给 $prev
- 将 $prev 进一步传递到下一个管道接收器。
并将整个结果集作为数组分配给 $workingCopies(任何超过 1 项的结果都将是数组)
foreach($copy in $workingCopies)
{
&"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}
Foreach 数组中的元素 - 执行命令(& 表示“作为命令执行”)“...\svn.exe 升级”
这里的所有魔力都在于回溯 $prev 元素: 在第一个“.svn”条目上 $prev 包含不匹配的值,因此首先检查“where”将减少为“如果条目是目录”。然后分配步骤将放置文件夹父目录。前任。如果找到的目录全名是 c:\projects\project1.root\trunk.svn - $prev 将被分配给 "c:\projects\project1.root\trunk\"。 这个技巧将帮助我们过滤所有较低级别的 .svn 目录: c:\projects\project1.root\trunk\SubProject1.svn 条目 - 将无法通过检查“不以 $prev 开头” 这样我们将仅过滤第一级 .svn 目录,因为所有嵌套的 .snv 将通过 StartsWith($prev) -eq $false
过滤所以它非常简单,但看起来有些神奇 =)
顺便说一句,谢谢您在这里的回答 - 您的努力极大地激励了我写这篇评论并澄清整个脚本。
应该召集语法极客来查看此评论,以清理和改写我的“所谓的英语”;)
关于svn - 如何在Win XP上找到所有 'SVN working copies',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898178/