如何在Win XP上找到所有'SVN工作副本'

时间:2012-03-27 21:44:06

标签: svn windows-xp find

我有Windows XP。我想升级TortoiseSVN to version 1.7。 为了做到这一点,我需要确保我可以在我的电脑上找到所有SVN工作副本。所以他们可以更新。

我找到了similar question,但它特定于Powershell。所以,我想知道是否有一个更通用的解决方案来在Win XP上找到所有'SVN工作副本'。

如果我在Windows上知道相当于'linux find'的话,我可以自己写一下。 但是我希望我和其他人可以使用bash脚本(或者可能是一些更简单的解决方案)。

  • 扫描计算机
  • 如果找到包含名为“.svn”的目录的目录
    • 回显该名称,
    • 不再搜索该目录

4 个答案:

答案 0 :(得分:2)

只要你有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”的所有文件和文件夹),从Path,递归开始。 并将其传递给下一个构造:

?{$_.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进一步传递到下一个管道接收器。
  3. 将整个结果集分配给$ workingCopies作为数组(任何包含多个项目的结果都是数组)

    foreach($copy in $workingCopies)
    {
        &"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
    }
    

    数组中的Foreach元素 - 执行命令(& sign代表“执行命令”)“... \ svn.exe upgrade”

    这里所有的魔力都是回溯$ prev元素: 在第一个“.svn”条目$ prev包含不匹配的值,因此首先检查“where”将减少为“If entry is directory”。然后分配步骤将放置文件夹父目录。防爆。如果发现dir fullname为 c:\ projects \ project1.root \ trunk.svn - $ prev将分配给 “c:\ projects \ project1.root \ trunk \” 即可。 这个技巧将帮助我们过滤所有较低级别的.svn目录: c:\ projects \ project1.root \ trunk \ SubProject1.svn 条目 - 不会通过检查“不以$ prev开头” 这样我们只会过滤第一级.svn dirs,导致所有嵌套的.snv将被 StartsWith($ prev)-eq $ false

    过滤掉

    所以它很简单,但看起来像是魔术=)

    顺便说一下,谢谢你自己的答案 - 你的努力极大地鼓舞了我写这篇评论并澄清整个剧本。

    语法极客应该被传唤到这个评论中来清理和改写我的“所谓的英语”;)

答案 1 :(得分:1)

对于Windows上的复杂和强大搜索,我可以推荐(我在现实生活中使用它)

  • Total Commander内嵌式搜索(您有合理的评估时间)
  • GrepWin(使用文件名模式的wildcard-和regexp-keywords)

你错过了这一点。 SVN-clients 1.7可以(并且必须)在使用之前升级现有的工作副本 。对于1.6之前的版本,WC内部的所有目录都有.svn dirs,你只对每个最顶层的感兴趣

以后它可能对你有用

1.6 svn-dir

.svn>dir /B
all-wcprops
entries
prop-base
props
text-base
tmp

1.7 svn-dir

.svn>dir /B
entries
format
pristine
tmp
wc.db

答案 2 :(得分:1)

我已经设法在Win XP上找到所有'SVN工作副本'。

我是使用Alexey Shcherbak提供的PowerSell script做的。

以下是使用 PowerShell方法的流程摘要。

测试您是否已安装PowerShell。

Windows PowerShell是一个命令行shell和脚本环境,它将.NET Framework的强大功能带给命令行用户和脚本编写者。

通过尝试启动它来测试它是否已经安装。

要从“运行”框中启动Windows PowerShell,请单击开始,单击运行,然后键入:

powershell

如果那不起作用......

安装

  • Cnet.com
  • 下载适用于Windows XP的Microsoft Windows PowerShell 1.0
  • (适用于Windows XP的PowerShell 2也可用,但我没有使用它。(instructions here))

一旦安装......

启动PowerShell并进行游戏

开始> 所有程序> Windows PowerShell 1.0 > Windows PowerShell

See a brief introduction to PowerShell on YouTube

创建PowerShell脚本

将Alexey Shcherbak的PowerSell script(找到svn工作副本)复制到文本文件中并将其另存为C:\PowerShellScripts\FindSvnWorkingDirectories.ps1

我稍微修改了它以搜索我的C驱动器并禁止访问被拒绝错误:

$prev = "^$"

Get-ChildItem -ErrorAction SilentlyContinue -Recurse -Force -Include ".svn" -Path "c:\" `
| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`
| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

详细说明此脚本的作用:

$prev = "^$"$prev初始化为空匹配的正则表达式; ^$永远不会匹配任何有意义的值(startline-endline除外)。这需要通过初步检查。

Get-ChildItem -ErrorAction SilentlyContinue -Recurse -Force -Include ".svn" -Path "c:\" `

获取名称为“.svn”的所有对象(在我们的例子中 - 具有确切名称“.svn”的所有文件和文件夹),从Path,递归开始。

    默认情况下,
  • Get-ChildItemdir命令的别名。
  • -ErrorAction SilentlyContinue - 防止显示错误,例如访问路径'C:\ System Volume Information'被拒绝 as described here
  • -Recurse表示重复搜索。
  • -Force确保找到隐藏文件。
  • -Include ".svn"标识我们正在搜索的文件名。
  • -Path "c:\" idnticies是搜索的路径。
  • `反引号意味着continue the statement to the next line

在下一行:

| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`

管道符号|Get-ChildItem的输出通过管道传输到下一个cmdlet中。

?{...statements... }Where-Object cmdlet的简写。

$_ is从管道中解决“每个”条目的方法。它基本上说“如果条目是一个目录”,“fullname不以$ prev的值开头”,那么“将条目传递给下一个构造”。

| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

然后将该条目传送到下一个语句。

%{}Foreach-Object的简写。这个结构做了两件事:

  • 将当前文件夹的全名分配给$prev(不带“.svn”尾部)。
  • $prev传递到下一个管道接收器。

允许PowerShell运行脚本

默认情况下,为了安全起见,PowerShell的ExecutionPolicy不允许您运行PowerShell脚本。所以,你需要允许它这样做。

有关详细信息,请参阅Running Windows PowerShell Scripts

我做了以下事情:

注意:哈希符号(#)只是命令提示符的shotrthand。

确定当前ExecutionPolicy

# Get-ExecutionPolicy
Restricted

如果像我一样,受限制。更改策略以允许脚本运行:

# Set-ExecutionPolicy RemoteSigned

运行PowerShell脚本

然后运行脚本以查找svn工作副本。请注意,您需要为PowerShell脚本指定完整路径

# C:\PowerShellScripts\FindSvnWorkingDirectories.ps1

如果PC上有大量目录,可能需要一些时间。结果应该出现。

将结果复制并粘贴到某处

我是通过用鼠标选择输出文本来完成的。然后,复制它:

点击 PowerShell图标(位于窗口左上角)> 修改> 复制

然后我将其粘贴到文本编辑器中。

将PowerShell Excecution Policy还原为其原始状态

由于我很少使用PowerShell而且我放弃了Excecution Policy只是为了运行这个,一次性的脚本,我将恢复它的原始状态以保证安全。

确定当前ExecutionPolicy

# Get-ExecutionPolicy
RemoteSigned

更改策略以将其恢复为原始状态:

# Set-ExecutionPolicy Restricted

所以我就这样做了。

答案 3 :(得分:0)

要查找所有.svn文件,您可以使用dir。 dir .svn /s会这样做(虽然它不会破坏扫描子目录),或者您可以使用Windows资源管理器并让小狗找到所有.svn文件。

或者你可以下载unxutils并使用find吧!