【问题标题】:How do I back up a remote SVN repository如何备份远程 SVN 存储库
【发布时间】:2011-01-19 03:27:07
【问题描述】:

我目前正在将我的 SVN 服务器从我的家庭服务器移动到我的远程服务器,以便我可以更轻松地从其他位置访问它。 我的远程服务器没有备份,所以我想定期将它备份到我的家庭服务器。

远程服务器是 Windows 2003 服务器。主服务器是 Windows 主服务器。

最好的方法是什么?我可以让我的家庭服务器每晚获取远程服务器的转储吗?带宽不是一个重要的考虑因素,但如果我可以将任何新的签到复制到我的家庭服务器上的 SVN 服务器,那就没问题了。

欢迎提出任何建议。

【问题讨论】:

  • 感谢您的快速回复。我认为 SVNSync 将完全按照我的意愿行事。 Pekka - 如果我考虑过它,你是对的,Serverfault 可能会更好地问这个问题。我在这里得到了如此好的快速答案,以至于我没有考虑其他网站。再次感谢。
  • 阿斯卡'!卡佐!美国任务突击队! (谐谑曲):-)

标签: svn backup


【解决方案1】:

只需使用svnsync 命令。

首先,在您的家用计算机上创建一个新的存储库。

svnadmin create c:\backuprepo

或者在 Unix 上:

svnadmin create ./backuprepo

接下来,创建一个名为 pre-revprop-change.bat 的文件:

echo exit 0 > c:\backuprepo\hooks\pre-revprop-change.bat

或者在 Unix 上:

echo -ne '#!/bin/sh\nexit 0' > ./backuprepo/hooks/pre-revprop-change
chmod ugo+x ./backuprepo/hooks/pre-revprop-change 

然后,初始化同步:

svnsync init file:///c:/backuprepo https://url/of/your/repository

或者在 Unix 上:

svnsync init file:///Volumes/volumelabel/backuprepo https://url/of/your/repository

之后,你可以简单地运行

svnsync sync file:///c:/backuprepo

一天左右一次,您将只获得那些尚未在您的备份存储库中的更改。第一次需要一段时间,但在您将备份存储库与真实存储库同步后,只需几秒钟即可同步它,因为只有那些新的修订需要同步。

【讨论】:

  • 如果可以的话,我会投票两次。与此处发布的其他答案不同,这个答案实际上是正确的。 rsync:不确定以一致的状态捕获存储库。 bdb 存储库不是跨平台的二进制兼容的。 svnadmin dump 需要访问服务器。
  • 如果您在类似 UNIX 的服务器上运行,请不要忘记授予您的钩子执行权限,否则会被视为失败:chmod a+x pre-revprop-change
  • 同样在类似 UNIX 的服务器上,不要忘记在 pre-revprop-change 的顶部添加 #!/bin/sh
  • svnsync: Path 'file:///Volumes/volumelabel/backuprepo' is not a URL
  • 如果您仍然收到 svnsync: E165001: Revprop change blocked by pre-revprop-change hook (exit code 255) without output.,它可能缺少执行权限:chmod +x ./backuprepo/hooks/pre-revprop-change
【解决方案2】:

从 subversion 1.7 开始,您还可以使用新命令 svnrdump。来自文档:

转储——即生成存储库转储流——位于 SOURCE_URL 的存储库项的修订版,将信息打印到标准输出。

用法是:

svnrdump dump http://example.com/repos/ > repos.dump

这会在repos.dump 中创建存储库的“转储文件”。这是您的存储库数据的完整备份,包括历史记录,但 subversion 客户端不能直接读取。如果您需要恢复这些数据,请使用标准的svnadmin 工具:

svnadmin create c:\backup-repos
svnadmin load c:\backup-repos < repos.dump

尚未进行任何测试,但这可能最终会比svnsync 慢。 svnrdump 每次都会对存储库进行完整转储,我假设synsync 只会导入自上次运行以来存储库中的更改。不过,您将拥有一个包含整个存储库的文件,这可能会也可能不会更容易管理。

请注意,您可能希望通过gzip 或类似程序将svnrdump 的输出通过管道传输,以显着减小输出文件的大小。

【讨论】:

  • 快多了。这是完美的。
【解决方案3】:

创建您的本地存储库

svnadmin create /Users/jsmith/repo

创建一个空的 pre-revprop-change 挂钩脚本

echo '#!/bin/bash' &gt; /Users/jsmith/repo/hooks/pre-revprop-change

使 pre-revprop-change 挂钩脚本可执行

chmod +x /Users/jsmith/backup/hooks/pre-revprop-change

初始化 svnsync

svnsync init file:////Users/jsmith/repo https://www.smith.com/repo

同步仓库

svnsync sync file:////Users/jsmith/repo

【讨论】:

    【解决方案4】:

    rsync(或DeltaCopy,它是基于它的 Windows UI)将是在文件系统级别以增量方式复制完整存储库的好选择。

    您还可以使用svnsync 将新修订版直接从一台 SVN 服务器复制到另一台。

    【讨论】:

    • 使用 rsync 的问题是,如果您在有人进行更改时复制存储库,则副本可能会损坏。 svnsync 比复制存储库要安全得多。
    • 是的,svnsync 将是首选解决方案。自从我认为 1.6 版本以来,它仅在 SVN 服务器上受支持,但现在似乎已广泛部署。
    • 虽然你的回答可能没问题,但除了@darrickc 提到的锁定问题之外,还有另一个缺点:它还需要对 svn 存储库进行文件系统级别的访问。在大多数情况下,它没有给出,只有一个 svn:// 或 http(s):// url。
    【解决方案5】:

    您可以在远程服务器上使用脚本转储存储库,然后将其复制到本地计算机(或将其保留在预定义的位置以供本地计算机复制)

    您可以将备份目录与rsyncscp 同步。

    该脚本可以使用“计划任务”运行,并且可以生成唯一命名的备份文件,稍后将通过您的本地计算机以上述方式同步。 (然后可能被删除)

    【讨论】:

      【解决方案6】:

      EFraim 在我写这篇文章的时候提到了 rsync,所以已经涵盖了。

      如果您不想使用它,Subversion Book 提供了svnadmin dump --incremental 选项,此处解释:

      但是,要成功做到这一点,您必须处理修订号 - rsync 原始存储库数据目录会更容易。

      困难的部分可能是设置 rsync 以便您的本地和远程机器可以安全地通信(即在 2003 服务器上设置 SSH 服务)。 Wim 提到的 DeltaCopy 非常有趣,这将是我的第一次尝试;仅用于命令行操作,这是how to get Rsync running as a service on Windows 2003 上的操作指南。

      【讨论】:

        【解决方案7】:

        我会使用svnsyncsvnadmin hotcopy,因为这两种技术都可以保证从存储库中复制有效数据,即使事务正在进行中。其他文件同步技术可能不那么可靠,具体取决于存储库格式。

        【讨论】:

          【解决方案8】:

          在 Mac OS X 10.10 中,svnrdump 命令位于此处:

          • /Library/Developer/CommandLineTools/usr/bin/svnrdump

          然后您可以使用上面 joesdiner 的答案。

          【讨论】:

            【解决方案9】:

            为了扩展 Stefans 的回答,这里有一些 Windows 批处理脚本来帮助自动化这个过程。

            svn-backup-init.bat

            @echo off
            set /P directory="Local Directory: "
            set /P URL="Svn URL: "
            
            echo "Running SVN backup";
            
            @echo on
            svnadmin create %directory%
            echo exit 0 > %directory%\hooks\pre-revprop-change.bat
            svnsync init file:///%directory% %URL%
            svnsync sync file:///%directory%**strong text**
            

            此脚本将创建 svn 存储库,并检查它并立即进行同步。运行脚本时,只需输入要在本地放置 repo 的目录和要使用的服务器的 URL。

            svn-backup-run.bat

            for /d %%i in (%~dp0*) do ( svnsync sync file:///%%i ) 
            

            这将遍历每个目录并运行 svnsync 命令。如果您有多个存储库,请将它们检出到同一个文件夹中。然后可以轻松地将其添加为 Windows 中的任务,以一次更新所有存储库。

            文件夹结构

            我使用这样的文件夹结构:

            .
            ├── svn-backups
            |   ├── repo-1
            |   ├── repo-2
            |   ├── repo-3
            |   ├── svn-backup-init.bat
            |   └── svn-backup-run.bat
            

            【讨论】:

              猜你喜欢
              • 2011-07-26
              • 2010-09-29
              • 1970-01-01
              • 1970-01-01
              • 2011-11-07
              • 1970-01-01
              • 2020-11-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多