代码之家  ›  专栏  ›  技术社区  ›  nlaq

将整个svn存储库回滚或还原到旧版本

  •  74
  • nlaq  · 技术社区  · 17 年前

    我正在linux机器(bash)上使用命令行。

    谢谢

    svnadmin create /svnroot/<repo>.fixed
    svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
    svnadmin load /svnroot/<repo>.fixed < dump.svn
    

    然后将旧回购放在备份位置,并将repo.fixed移动到repo。

    14 回复  |  直到 17 年前
        1
  •  26
  •   Justin Love    17 年前
        2
  •  25
  •   luapyad    17 年前

    “反向”合并可能是您所需要的。看见 "undoing changes" svn手册的一节。

    例如。 svn合并-r 28:24[到svn的路径]

        3
  •  14
  •   fuenfundachtzig    16 年前

    path/db/current ,将要还原到的旧修订号(此处:24)放在那里,并从中删除不再需要的修订文件(即25、26、27、28) path/db/revs/0/ . 今天,在我意外地删除了存储库中的一个目录之后,这至少对我起到了作用。

        4
  •  13
  •   Sander Rijken    17 年前

    如果确实需要清除文件曾经存在的“证据”,则需要执行上述svndump/svnload操作。

    在“正常”情况下,如果您犯了错误,则需要使用反向合并。这样可以确保在r24之后撤消更改也可以恢复、更改等。

    下面的命令可以撤消更改(您需要提交合并结果以反映存储库中的合并)

    svn merge -r 28:24
    
        5
  •  6
  •   MarcH rhardih    15 年前

    svn删除protocol://svnserver/some/resource
    svn副本protocol://svnserver/some/resource@24 protocol://svnserver/some/resource

    就是这样,svn日志中的25到28版本已经完全消失了。这根本不是黑客攻击,它是一个安全且(几乎没有…)文档化的特性。

    如果“资源”是一个目录,则必须将其从最后一个URL中删除:

    (否则,您会将其复制到内部)

        6
  •  5
  •   Paul Suart Wes    13 年前

    对于任何使用OrtoiseSVN的人来说,解决方案很简单:

    • 右键单击要回滚到的修订。。。
    • …选择“还原到此修订版”
    • 提交您的更改

    此方法保留版本历史记录(即您还原的所有修订)。

        7
  •  3
  •   nickf    17 年前

    您可以对特定修订进行新签出。 http://svnbook.red-bean.com/en/1.1/re04.html

    svn co path/to/my/repo -r 24
    
        8
  •  2
  •   neesh    14 年前

        9
  •  1
  •   genehack    17 年前

    如果确实要从存储库中完全删除文件,则需要对文件执行svndump,过滤掉不需要的rev和/或文件路径,创建新的repo,并将过滤后的转储加载到新存储库中。你会想仔细阅读的 the SVN book section on repository maintenance

        10
  •  1
  •   oers Alfian Busyro    14 年前

    你能 svn del 然后是最上面的目录 svn copy 他们:

    svn copy svnurl@version svnurl 
    
        11
  •  0
  •   Juan Juan    17 年前

        12
  •  0
  •   Kent Fredric    17 年前

    以下是我将如何开始做这件事。残酷,是的,但这是唯一保证完全忽略碰撞的东西 保持修订历史的完整性。

      cd /scratchdir 
      svn co -r good svn://repository
      cd /hosed_project
      svn up -r HEAD
      cat >> /tmp/cp.sh 
      ORIG=$1
      TARG=$( echo $ORIG | sed 's/\/scratchdir\///' ); 
      cp $ORIG /hosed_project/$TARG;
      ^D
      chmod u+x /tmp/cp.sh
      find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;
    

    (工作)

    编辑: 以上代码未经测试,请勿逐字运行

        13
  •  0
  •   user50384 user50384    17 年前

    似乎

    svn update -r 24 trunk
    

    哪里 是修订号,以及 大旅行箱

    在我的测试中,有几个文件被更新和(重新)添加,在提交之后,我没有收到任何警告。然后,我用一些伪文本修改了一个文件,并尝试了另一个提交,只有那个文件在修改列表中弹出。所以它似乎工作得相当好!

    再说一次,我以前没有在现场制作中使用过这个,所以如果我错了,请给出建议。我很想知道这是否也是一条路,因为我可以看到我自己在不久的将来需要这条路。

    -戴夫

        14
  •  0
  •   Mazrick    15 年前
    Example:
        Rev 100 all is working great        
        Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
        Rev 102 You delete /trunk
        Rev 103 You copy /trunk@100 to HEAD
            You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.
    
    svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
    svn copy svn://[RepoName]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"
    
    推荐文章