我有Windows XP。我想升级TortoiseSVN to version 1.7。 为了做到这一点,我需要确保我可以在我的电脑上找到所有SVN工作副本。所以他们可以更新。
我找到了similar question,但它特定于Powershell。所以,我想知道是否有一个更通用的解决方案来在Win XP上找到所有'SVN工作副本'。
如果我在Windows上知道相当于'linux find'的话,我可以自己写一下。 但是我希望我和其他人可以使用bash脚本(或者可能是一些更简单的解决方案)。
答案 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 =的快捷方式 这个构造做了两件事:
将整个结果集分配给$ 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上的复杂和强大搜索,我可以推荐(我在现实生活中使用它)
你错过了这一点。 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方法的流程摘要。
Windows PowerShell是一个命令行shell和脚本环境,它将.NET Framework的强大功能带给命令行用户和脚本编写者。
通过尝试启动它来测试它是否已经安装。
要从“运行”框中启动Windows PowerShell,请单击开始,单击运行,然后键入:
powershell
如果那不起作用......
一旦安装......
开始> 所有程序> Windows PowerShell 1.0 > Windows PowerShell
See a brief introduction to PowerShell on YouTube。
将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-ChildItem
是dir
命令的别名。-ErrorAction SilentlyContinue
- 防止显示错误,例如访问路径'C:\ System Volume Information'被拒绝 as described here。-Recurse
表示重复搜索。-Force
确保找到隐藏文件。-Include ".svn"
标识我们正在搜索的文件名。-Path "c:\"
idnticies是搜索的路径。在下一行:
| ?{$_.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的ExecutionPolicy
不允许您运行PowerShell脚本。所以,你需要允许它这样做。
有关详细信息,请参阅Running Windows PowerShell Scripts。
我做了以下事情:
注意:哈希符号(#)只是命令提示符的shotrthand。
确定当前ExecutionPolicy
:
# Get-ExecutionPolicy
Restricted
如果像我一样,受限制。更改策略以允许脚本运行:
# Set-ExecutionPolicy RemoteSigned
然后运行脚本以查找svn工作副本。请注意,您需要为PowerShell脚本指定完整路径。
# C:\PowerShellScripts\FindSvnWorkingDirectories.ps1
如果PC上有大量目录,可能需要一些时间。结果应该出现。
我是通过用鼠标选择输出文本来完成的。然后,复制它:
点击 PowerShell图标(位于窗口左上角)> 修改> 复制强>
然后我将其粘贴到文本编辑器中。
由于我很少使用PowerShell而且我放弃了Excecution Policy只是为了运行这个,一次性的脚本,我将恢复它的原始状态以保证安全。
确定当前ExecutionPolicy
:
# Get-ExecutionPolicy
RemoteSigned
更改策略以将其恢复为原始状态:
# Set-ExecutionPolicy Restricted
所以我就这样做了。
答案 3 :(得分:0)
要查找所有.svn文件,您可以使用dir。 dir .svn /s
会这样做(虽然它不会破坏扫描子目录),或者您可以使用Windows资源管理器并让小狗找到所有.svn文件。
或者你可以下载unxutils并使用find吧!