如何为VisualSVN Repos进行日常备份?
它在Windows Server 2003机器上,我在考虑只对文件夹 C:\ Repo 进行xcopy,但我对svn不熟悉,知道这是否会导致问题。
救救我!
答案 0 :(得分:1)
正确的方法是使用svnadmin hotcopy创建c:\Repo
的副本,然后将该副本归档到磁带或异地存储或其他任何内容。关于Subversion Book的Repository Maintenance章节有更多详细信息。
答案 1 :(得分:0)
我同时进行转储和热拷贝。将它们放在批处理文件中,并使用Task Scheduler创建一个任务,以便每天运行它。这是我的样本批处理文件
!backing up credentials
copy H:\Repositories\authz G:\Repo-Backups\7-22-2013\backup
copy H:\Repositories\authz-windows G:\Repo-Backups\7-22-2013\backup
copy H:\Repositories\htpasswd G:\Repo-Backups\7-22-2013\backup
!full dump
svnadmin dump H:\Repositories\Proj1 > G:\Repo-Backups\7-22-2013\dump\Proj1
svnadmin dump H:\Repositories\Proj2 > G:\Repo-Backups\7-22-2013\dump\Proj2
!hard copy
svnadmin hotcopy H:\Repositories\Proj1 G:\Repo-Backups\7-22-2013\backup\Proj1
svnadmin hotcopy H:\Repositories\Proj2 G:\Repo-Backups\7-22-2013\backup\Proj2
如果您有多个存储库(项目)需要备份并且它们经常更改,那么让一个小程序为您创建上述批处理文件会更容易。以下是我为此目的所写的内容:
public static void CreateBackupScript(string srcFolder, string desFolder, bool fullDump)
{
if (string.IsNullOrEmpty(srcFolder) || string.IsNullOrEmpty(desFolder))
return;
var dateString = DateTime.Now.ToShortDateString().Replace('/', '-');
var destination = System.IO.Path.Combine(desFolder, dateString, "backup");
if (!Directory.Exists(destination))
Directory.CreateDirectory(destination);
var source = srcFolder + "\\";
var outputScript = "backup.cmd";
using (StreamWriter sw = new StreamWriter(outputScript))
{
sw.WriteLine("!backing up credentials");
sw.WriteLine("copy {0}authz {1}", source, destination);
sw.WriteLine("copy {0}authz-windows {1}", source, destination);
sw.WriteLine("copy {0}htpasswd {1}", source, destination);
// dump
if (fullDump == true)
{
sw.WriteLine("!full dump");
var dumpFolder = System.IO.Path.Combine(desFolder, dateString, "dump");
if (!Directory.Exists(dumpFolder))
Directory.CreateDirectory(dumpFolder);
foreach (var dir in new DirectoryInfo(source).GetDirectories("*.*", SearchOption.TopDirectoryOnly))
{
sw.WriteLine(@"svnadmin dump {0} > {1}\{2}", dir.FullName, dumpFolder, dir.Name);
}
}
//hot copy
sw.WriteLine("!hard copy");
foreach (var dir in new DirectoryInfo(source).GetDirectories("*.*", SearchOption.TopDirectoryOnly))
{
sw.WriteLine(@"svnadmin hotcopy {0} {1}\{2}", dir.FullName, destination, dir.Name);
}
}
}