使用Subversion进行通用备份

时间:2008-09-15 05:16:15

标签: svn backup

是否可以将Apache Subversion(SVN)用作通用备份工具? (作为一种rsync替代方案。)

12 个答案:

答案 0 :(得分:9)

我发现这篇文章是使用svn备份主目录的一个非常酷的描述,以及更多:

  

我使用Subversion备份我的Linux机器。有一些小的创造力,它很容易涵盖:

     
      
  • 每日快照和异地备份。
  •   
  • 轻松添加和删除文件和文件夹。
  •   
  • 详细跟踪文件版本。
  •   
     

它还允许一些奖励功能:

     
      
  • 定期登录电子邮件,通过Subversion的事件挂钩跟踪文件系统活动。
  •   
  • 用户可以从任何存储库修订中请求签出其主文件夹。
  •   
  • 可以使用几个svn checkout命令设置新服务器或替换服务器。
  •   

来源:http://www.mythago.net/svn_for_backup.html

还找到this article,其中显示了对主目录进行版本控制的示例。这使您可以通过将主目录签入新计算机来随身携带您的环境。我曾经做过类似的事情,发现它很有用。

答案 1 :(得分:4)

使用SVN作为二进制文件备份时要记住的一件事是SVN会使文件大小加倍,因为它保留了每个文件(在.svn / text-base)文件中的本地副本。

除此之外,我还使用SVN进行备份。只需添加所有文件,然后通过脚本提交。

答案 2 :(得分:4)

作为“通用”备份,我认为它可能不是最好的主意,主要是出于其他人给出的原因(大量过多的文件夹和浪费的磁盘空间)。如果您只想保留备份,我会说可能有更好的选择,具体取决于您的需求,例如:您是否需要保留每个文件的每个版本,或者您的数据的某些快照是否足够?

但是,在我的办公室,我们有一个由6人组成的小团队,他们使用共享文件(例如:政策和程序手册,注册表等)。很多时候,团队成员将远程工作(从家里或旅行时),并且经常离线工作。我们不是使用中央共享文件夹设置,而是使用SVN为每个人提供他们可以处理的文件夹的完整工作副本,并尽可能地引用和同步。这样可以一举两得:每个人都可以在离线状态下访问和编辑文件,而且它还为我们的备份提供了非常好的冗余。如果我的笔记本电脑catches on fire,这没有麻烦,因为我可以检查另一个副本(显然在另一台计算机上)。如果服务器着火,我们将备份存储库以进行恢复。如果服务器和所有repo备份都着火,那么你丢失的所有内容都是旧版本的文件。丢失任何当前数据的唯一方法是,服务器,您的repo备份以及每个具有结帐功能的计算机都会引起轰动。

正如有些人所说,SVN永远不会从存储库中删除信息,这意味着如果你只想保留60天的备份,那么,你不能。这不完全正确。通过使用exportdumpimport,您可以有效地删除旧版本的文件。它不漂亮,但它是可能的。

答案 3 :(得分:1)

有一件事,那会让我烦恼的是'.svn'文件夹,svn放入它跟踪的每个文件夹中。

它们看起来很烦人,当你复制一个文件夹时,你应该记得不要复制它们(或者你的沙箱可能会受到刺激)并且通过一堆文件夹来查找它要困难得多,因为通常会有很多命中在.svn资源文件夹中。

我喜欢使用源代码控制来控制您的环境。但我个人不会选择svn来完成这项工作。我会选择像git这样的东西。但那可能就是我......

答案 4 :(得分:1)

我确实使用SVN来备份我的电脑,并同步我的笔记本电脑和桌面。但它确实存在早期答案中提到的问题,主要是磁盘使用量增加一倍。我也觉得文件过多和SVN进程不断地检查我的HD是否会让我的机器变慢。

然而,我想强调一点,SVN非常适合同步不同的机器,如果需要,您还可以在任何地方查看文件,我甚至可以在浏览器中通过网页界面,有时候。

总之,我对使用SVN进行通用备份感到复杂。但是,如果你这样做,我建议 来存储电影,照片和音乐等库,因为它们往往很大(很大程度上受到空间使用量的增加)和不可变的 - 您不需要版本控制系统,因为在极少数情况下更改文件时,通常不需要旧版本(并且SVN不擅长制作/存储二进制文件的差异,它保存文件的整个新版本)。因此,除非SVN可以针对这些情况进行调整(我的长期项目意图),否则我建议使用备用方法来备份这些类型的文件。

答案 5 :(得分:1)

您还可以考虑bup - 基于git packfile格式的高效文件备份系统。它基于git存储数据的方式,这对于存储文件非常有效和他们的分歧。

答案 6 :(得分:0)

我用CVS代替幽灵,所以我不明白为什么不这样做。

我很好,因为你可以标记一个基线:你可以改变管理机器。

这显然在unix上比windows更好。

答案 7 :(得分:0)

让我想到这个想法的是,对于一般用途,任何二进制数据都会在它改变的任何时候被复制,而文本内容SCM系统基于可以很容易地以差异的形式更新。

所以你可以这样做,只要知道你可能不想用它来管理像照片库这样的东西,如果你做了很多编辑。

更多通用备份解决方案(比如Time Machine)的好处是它们可以在一段时间之后汇总多个二进制更改以节省空间。我不确定在SVN或git或mercurial中做多么容易。

答案 8 :(得分:0)

使用SVN进行备份可以正常工作。但是,随着时间的推移,可能很难删除不需要的旧版本。假设您只想保留30或60天的备份。 SVN无法轻松删除任何超过X天的历史记录。如果您无法清除旧历史记录,则最终会在空间中运行备份驱动器。

以下是SVN Book on the svndumpfilter命令的引用:

  

因为Subversion存储了所有内容   一个不透明的数据库系统,尝试   手动调整是不明智的,如果不是完全的话   难。一旦数据一直存在   存储在您的存储库中的Subversion   一般不提供简单的方法   删除该数据。 [13]

     
    

[13]顺便说一下,这是一个特征,而不是一个bug。

  

对于rsync替代方案,我发现unison比svn更好。

答案 9 :(得分:0)

使用源代码控制备份/ etc可能是一个很大的帮助,当您想要恢复管理系统,试验更改或将更改从一台服务器转移到另一台服务器的更改时。

但是subversion的众多.svn目录可能会妨碍搜索,而不仅仅是在搜索时,但在某些情况下,如* .d文件夹,设计不佳的系统可能会将.svn文件夹本身解释为包含配置数据。

我现在更喜欢使用Mercurial来备份/ etc,因为它在/ etc下放了一个.hg文件夹。对于真正的备份而不仅仅是版本控制,您需要将该.hg文件夹复制到其他位置。

答案 10 :(得分:0)

JoaoPSF的这句话不正确:

  

(SVN不擅长制作/存储二进制文件的差异,它保存了整个新版本的文件)

请参阅How does Subversion handle binary files中的这句话:

  

请注意,文件是否为二进制文件不会影响用于存储对该文件的更改的存储库空间量,也不会影响客户端和服务器之间的通信量。出于存储和传输的目的,Subversion使用一种在二进制和文本文件上同样有效的diffing方法;这与svn diff命令使用的diffing方法完全无关。

答案 11 :(得分:0)

要在Linux上使用SVN作为备份,请执行以下操作:

  1. 创建一个空仓库。
  2. 将空存储库签出到要备份的文件夹树中。
  3. 使用以下代码段(svnauto)。您必须使用存储库的有效凭据替换“myuser”和“mypassword”:
  4.     #!/bin/sh
        svn status --depth=infinity --username=myuser --password=mypassword > /tmp/svnauto_tmp.list
        cat /tmp/svnauto_tmp.list | grep '^?' | sed -e 's/^?       /svn add --depth=infinity --force --username=myuser --password=mypassword "/g' -e 's/$/@"/g' | sh
        cat /tmp/svnauto_tmp.list | grep '^!' | sed -e 's/^!       /svn delete --username=myuser --password=mypassword "/g' -e 's/$/@"/g' | sh
        rm -f /tmp/svnauto_tmp.list
        svn update . --username=myuser --password=mypassword
        svn commit --username=myuser --password=mypassword --message "Automatic backup"
    

    上面的脚本将添加/删除并更新当前目录中的所有文件和子目录。要将cd简单地用于要备份的文件夹(当然必须是工作副本),然后运行svnauto。请注意,您需要在系统上安装grep和sed,并在/ tmp中创建一个临时文件。它可以在cron作业中用于夜间提交,使用以下cron脚本:

    #!/bin/sh
    export LANG=en_US.UTF-8 && cd /my/directory && echo Starting backup $(date) > /root/backup_log.txt && /root/svnauto >> /root/backup_log.txt 2>&1 && echo Finished backup. >> /root/backup_log.txt && cat /root/backup_log.txt
    

    此cron脚本假定/my/directory是您要备份的文件夹(根据需要进行替换)。它还假设您将svnauto脚本放在/root中。它会创建一个日志并在最后显示它。还有一个细节:svn需要第一个export才能找到合适的语言。您可能需要将此行调整为您自己的本地语言才能使其正常工作。