【问题标题】:Roll back or revert entire svn repository to an older revision回滚或恢复整个 svn 存储库到旧版本
【发布时间】:2010-09-28 23:10:19
【问题描述】:

我搞砸了我的 SVN 存储库,现在需要将整个存储库从修订版 28 恢复到 24,并且不想处理差异或冲突。有没有一种快速简单的方法来做到这一点?我已经能够使用合并命令恢复单个文件 - 但在这种情况下,它希望将所有文件从修订版 28 添加回存储库,而我真正想要做的就是删除它们。

我在 linux box (bash) 上使用命令行。

谢谢

编辑

感谢大家的帮助!我通过以下方式修复了它:

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

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

再次感谢!

【问题讨论】:

  • 只是想说声谢谢。我正在学习 svn 并且搞砸了移动一些目录(原来我是出于某种原因以另一种方式完成的!)我希望它消失。你的问题为我省去了很多麻烦。
  • 谢谢,我相信这可行,但是当您的存储库有 10k+ 修订版时需要很长时间。 :(

标签: svn revert


【解决方案1】:

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

  • 查看更改日志
  • 右键单击要回滚到的修订...
  • ...选择“恢复到此版本”
  • 提交更改

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

【讨论】:

  • 我或多或少地使用了你在这里所说的,因为版本历史被保留了,但我所做的是删除我的工作副本的源代码,然后选择“更新项目到修订版”(因为“恢复到此修订版”并没有退出修订版后创建的文件)。 TortoiseSVN 用户的绝佳解决方案:)
  • 我很确定问题是关于删除历史记录
  • 这个选项在 TortoiseSVN 中不存在,至少在 2018 年不存在。
【解决方案2】:

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

svn copy svnurl@version svnurl 

【讨论】:

    【解决方案3】:

    如果您的应用程序的文件夹结构未更改,请检出旧版本并将最新版本中的 .svn 文件夹替换为检出的旧版本。现在您可以提交“旧”版本。

    【讨论】:

    • 老实说,这对我来说听起来像是一个黑客攻击。
    • 不幸的是,文件夹结构发生了显着变化,否则我将手动删除需要删除的内容。感谢您的意见。
    • 我同意这是一个 hack;但这是一种一次性的情况,所以我不确定我是否会寻找最优雅的解决方案。快速简单的事情就足够了。
    【解决方案4】:

    如果您没有使用管理员权限,那么您将无法删除任何旧版本,但您仍然可以通过一个非常简单的“svn copy”命令将它们隐藏得非常好(nickf 和 JesperE 已经提到了这一点,但以一种相当神秘的方式)

    svn 删除协议://svnserver/some/resource
    svn 复制协议://svnserver/some/resource@24 协议://svnserver/some/resource

    就是这样,修订版 25 到 28 已经完全从 svn 日志中消失了。这根本不是 hack,它是一个安全且(几乎……)记录在案的功能。

    如果“资源”是一个目录,那么你必须从最后一个 URL 中去掉它:

    svn 复制协议://svnserver/some/directory@24 协议://svnserver/some/

    (否则你会把它复制到里面)

    【讨论】:

    • 如果svn copy prot://srv/path/proj ... 命令给你一个类似“svn: E170000: ... is not in the same repository as ...”的错误,那么你可以通过@ 987654322@ 然后svn copy coolver/proj prot://srv/path/ ; #ftw!
    【解决方案5】:
    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"
    

    【讨论】:

      【解决方案6】:

      如果你可以访问 SVN 服务器,你可以编辑path/db/current,把你想恢复到的旧版本号(这里:24)放在那里,然后删除不再需要的版本文件(即 25、26、 27, 28) 来自path/db/revs/0/。至少今天这对我有用,因为我不小心删除了存储库中的一个目录。

      【讨论】:

      • 迄今为止最快最简单的事情,我过去也使用过这个技巧。不过,养成这个习惯是个坏习惯,我永远不会在其他人正在使用的仓库中这样做,或者在其中包含关键数据。最好通过管理工具正确使用。
      • 我不知道所有可能发生的事情,但我知道它可能以后会制造麻烦,因为我曾经有这样做之后下一次提交的问题。话虽如此,我已经成功完成了几次,当然你先备份了你的repo,对吧? (当然,一个明显的问题是,在您执行此操作后,旧工作副本的 repo 状态缓存将与实际 repo 不匹配,因此总是在此之后立即进行新的结帐并开始工作,否则不匹配很可能会导致提交问题。)
      • 哦,这很脏……但似乎有效。但是,我必须运行 svnadmin recover /path/to/repo 才能再次提交。
      • 值得注意的是,如果您的提交少于 1000,文件仅在 path/db/revs/0 中。如果你有更多,文件在path/db/revs/X,其中 X 是提交号除以 1000
      【解决方案7】:

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

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

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

      svn merge -r 28:24
      

      【讨论】:

      • 哈哈,好吧,我可以详细说明这不是“正常”情况,但不想让自己更尴尬
      • “异常”情况是如果您提交了一些秘密,例如包含密码或类似内容的文件;您希望将其完全删除。关于这方面的最新消息是关于“svn obliterate”的事情正在开始
      【解决方案8】:

      我不完全确定这项工作是否有效,因为我还没有在现场生产中使用它,但我刚刚尝试了一个测试存储库(我复制了我的一个生产存储库),它似乎 工作。

      当您在存储库中时,使用以下命令:

      svn update -r 24 trunk
      

      其中 24 是修订号,trunk 是您要更新(或在本例中恢复)到所述修订号的文件/文件夹。

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

      再一次,我之前没有在现场制作中使用过这个,所以如果我错了,请指教。我很想知道这是否也是可行的方法,因为我可以看到自己在(不久的)将来需要它。

      -戴夫

      【讨论】:

      • 这只会将您的工作副本更新到这个旧版本,并且无法如上所述提交。
      • 你确定吗?我已经在测试环境中尝试过这个,它似乎可以正常提交?不过我可能是错的。
      • 如果文件在 r24 之后有修订并且您对其进行了修改,那么 svn 将无法提交任何更改并要求您先更新到 HEAD
      【解决方案9】:

      如果您真的想从存储库中完全删除文件,您需要对文件执行 svndump,过滤掉您不想要的 revs 和/或文件路径,创建一个新的 repo,然后 svnload 过滤后的转储进入新的存储库。在执行任何此操作之前,您需要仔细阅读 the SVN book section on repository maintenance,并确保在确定新的 repo 包含您想要的东西之前不要删除现有的 repo。

      【讨论】:

        【解决方案10】:

        这是我将如何开始做的。残酷,是的,但它唯一保证完全忽略冲突保持修订历史完整。

          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 {} \;
        

        注意,这不是 IMO 的“正常”方式,正常方式是从旧版本创建一个分支,然后将该分支合并回头部。 (至少,它使用是这样工作的)

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

        【讨论】:

          【解决方案11】:

          查看 svnadmin 转储/加载。它会为您的文件的每个版本创建一个文本文件。可以删除高于/低于某个点的所有内容并重新导入。

          例如见Migrating Repository Data Elsewhere

          【讨论】:

          • 我正在调查这个,谢谢。当然,我一定会不小心输入 svnadmin dump 而没有管道,所以现在我的整个项目都被写入标准输入(并且不会用 ctrl+c 停止)......我不会再犯这个错误了:p
          • 好的;我现在走在正确的轨道上,谢谢!但是我怎样才能使它保留我的修订?我写了一个 perl 脚本,对于 1 到 24 “svnadmin dump -r $i:$i+1 > file”,然后是“svnadmin load
          • 确保在更改历史记录时重新加载备份时更改存储库的 guid。否则,您可能会使用旧的工作副本和已更改的数据库,并在以后得到严重损坏的修订版(因为它们是基于不再存在的版本的增量构建的)。
          【解决方案12】:

          我不想这么说,但这是我发现自己使用我的 svn 存储库备份的情况。

          您可以将某个修订版本的文件复制到存储库中的新目录吗?

          【讨论】:

          • 备份 SVN 本身听起来很傻,但听起来那是我首先应该做的事情:/
          • 我的 svn 存储库被损坏了,这并不好玩。我经常做备份,把副本放在银行的保险箱里。
          • 备份是一种很好的做法,但在这种情况下从备份中恢复应该是不必要的。
          【解决方案13】:

          “反向”合并可能是您需要的。参见 svn book 的"undoing changes" 部分。

          例如 svn merge -r 28:24 [svn 路径]

          【讨论】:

          • 它不会删除在 28 中创建的文件。问题是我添加了一堆我不应该添加的文件。是的,我真的搞砸了。手动追踪需要删除的内容是不可能的。我只想在 24 岁之后“删除”每次回复。
          • 抱歉 - 我一定没有完全理解您的问题。我曾多次使用反向合并来删除新​​(但不正确)添加的文件...(但您的情况必须略有不同?)(您通常不能从 svn 存储库中删除修订 - 仅添加修复的新文件错误)。
          • 您需要做的就是合并回来,如答案所示,然后将您的项目重新签入 (svn ci -m "Revering all changes back to revision X")。仍然可以签出错误的修订,但是,这会将您想要的修订放回 HEAD。
          【解决方案14】:

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

          svn co path/to/my/repo -r 24
          

          【讨论】:

          • 我已经这样做了,但它拒绝作为新修订提交回存储库。有可能这样做吗? IE。将修订版 29 制作成修订版 24 的副本?
          • 是的。 svn copy 命令可以做 repo -> repo 副本。检查“svn help copy”的确切语法。
          猜你喜欢
          • 1970-01-01
          • 2012-10-28
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-31
          • 1970-01-01
          相关资源
          最近更新 更多