svn - 如何在Win XP上找到所有 'SVN working copies'

标签 svn windows-xp find

我有 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 的快捷方式 =) 这个构造做了两件事:

  1. 将不带“.svn”尾部的文件夹全名分配给 $prev
  2. 将 $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/

相关文章:

SVN 错误 - svn : E000013: Can't open file '/usr/local/svn/repos/puppetdb/db/txn-current-lock' : Permission denied

java - 子剪辑:无法生成 DH key 对

svn - 使用相对路径在命令行上创建 SVN Diff

firefox - 带有 Java 代码的 WebDriver 不打开 Firefox,在 Windows XP 中什么也不做

svn - 在 Subversion 中保留文件创建日期

visual-studio-2012 - 是否可以使用 Visual Studio 2012 编译器针对 Windows Installer 3.0?

batch-file - xp批处理文件中的行长度限制?

linux "find"命令

bash - 如何缩短字符串

linux - 如何删除 linux 代码文件中未使用的文件?