使用 Powershell 备份您的 SVN 存储库






4.40/5 (4投票s)
如何使用 Powershell 自动化备份 Subversion 存储库
引言
备份您的 SVN 仓库是个好主意。使用 Powershell 和 svnadmin 自动化备份会更好。
背景
我使用 Subversion 作为我的主要源代码控制工具已经有一段时间了。它对我来说效果很好。在这段时间里,我从未丢失过任何我不想丢失的东西。但是,“尽早且经常”地备份始终是一个好习惯。我发现,如果我不自动化像备份我的仓库这样的过程,我往往会忘记它,直到为时已晚。
考虑到这一点,我创建了一个 Powershell 脚本,可以安排它每天运行,以确保完成备份。我决定使用 Powershell,因为它为 Windows 环境带来了强大的功能。作为一名 .NET 开发人员,我喜欢它使用 .NET Framework 的能力。我绝不是 Powershell 大师,但我通过将 Microsoft 网站上的不同示例拼凑在一起,能够让它运行起来。
Using the Code
本文的前提是您已经熟悉 Powershell 和 Subversion。如果不是,Powershell 的一个好的起点是这里。有关 Subversion 的信息位于此处。
在使用此脚本之前,您需要访问 svnadmin.exe。我们将使用 svnadmin 的“hotcopy
”功能来备份 SVN 仓库。我使用 TortoiseSVN,它不包含 svnadmin。 我从最新版本的 SlikSVN 获取了它。
此脚本的作用是它会在您设置的目录中查找,并循环遍历其下的每个目录,假设它是一个仓库。它将运行 svnadmin 将仓库复制到临时目录。 然后它将压缩该副本,并将时间戳添加到文件名,并将其保存在您也将设置的备份目录中。它还会根据创建以来的天数删除任何较旧的备份文件。
脚本
下载脚本并查看。首先要注意的是,所有函数都必须位于脚本文件的顶部。向下滚动到逻辑开始执行的位置。让我最烦恼的是让 Powershell 执行 svnadmin 和压缩目录。事实证明,“&”并将所有内容放入 string
变量中对于从 Powershell 运行带有参数的可执行文件非常重要。zip 函数类似于在 Windows 资源管理器中使用发送到压缩文件夹的功能。
设置变量
在脚本文件的顶部找到并修改这些变量,以便在您的环境中工作。
$RepositoryPath = "\\SVN\Repositories"
$RepoBackupPath = \\SVN\Backups\
$svnAdminexe = "C:\Utils\SlikSvn\bin\svnadmin"
$DaysToKeepBackups = 14
为了使用“配置优于约定”,$RepositoryPath
变量是您要备份的仓库的位置。您的所有仓库都必须在此目录中,此脚本才能备份它们。
$RepoBackupPath
变量是所有压缩文件将保存的位置。它们都将位于基于仓库名称的单独目录中。
$svnAdminexe
是不言自明的。它是 svnadmin.exe 的位置。
$DaysToKeepBackups
也是不言自明的。此脚本将删除创建日期早于此处设置的天数的任何备份文件,除非您将其设置为 0,否则不会删除任何内容。
运行脚本时遇到问题
如果您在运行它时遇到问题,并且看到此消息“The execution of scripts is disabled on this system. Please see "Get-Help about_signing" for more details.” 查看此 页面 以了解有关签名脚本的信息。
更新
我的一些仓库开始达到 zip 功能需要几秒钟以上才能完成的地步。由于我使用 Windows 任务计划程序来运行它,我的脚本在最后一个 zip 完成之前就结束了,这中止了 zip。
问题是 .copyHere
方法是异步的,并且它没有足够的时间在任务结束前完成。
$_zipName.copyHere($_dirToZip)
一种解决方法是休眠一段时间,猜测最长的 zip 需要多长时间。 我还决定检查一下我要压缩的所有文件是否都已添加到 zip 中。 由于我将目录发送到 zip 文件,因此完成时的计数将为 1。 以下代码将等待直到 zip 文件至少有一个项目
do {
$zipCount = $_zipName.Items().count
"Waiting for compression to complete ..."
Start-sleep -Seconds 2
}
While($_zipName.Items().count -lt 1)
我在循环之间添加了 2 秒的等待时间,以便有更多的时间完成。我还脚本文件的末尾添加了 5 秒的等待时间,因为即使完成了此解决方法,任务仍然结束得太快而无法完成压缩。