将整个svn代码库回滚或还原到早期版本

76

我在SVN仓库上搞砸了,现在需要将整个仓库从版本28还原到24,但不想处理差异或冲突。是否有快速简便的方法来完成这个操作?我以前能够使用合并命令成功地回退单个文件,但在这种情况下,它想要将所有文件从版本28添加回仓库,而我真正想做的只是删除它们。

我在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。

再次感谢!


3
谢谢你。我正在学习svn并搞糟了一些目录的移动(结果发现我曾有个理由把它们放在那儿!),我想要把这些改变撤销。你的问题帮我省了很多麻烦。 - AgentConundrum
谢谢,我相信这个可行,但当你的仓库有10,000多个版本时,需要很长时间。:( - Amir Pashazadeh
14个回答

0

我不想这么说,但我发现自己不得不使用svn仓库的备份。

你能将某个版本的文件复制到仓库中的新目录吗?


备份 SVN 听起来很傻,但似乎这是我一开始就应该做的事情 :/ - user19302
我曾经遇到过svn仓库损坏的情况,那真是太糟糕了。 我会经常备份,并将备份拷贝放在银行的保险箱里。 - Juan
备份是一个好的习惯,但在这种情况下,从备份中恢复不应该是必需的。 - Sander Rijken

0

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

当您位于存储库中时,请使用以下命令:

svn update -r 24 trunk

其中24是修订版本号,而trunk是您想要更新(或在此情况下还原)到该修订版本号的文件/文件夹。

在我的测试中,有几个文件被更新和(重新)添加,提交后我没有收到任何警告。然后我修改了一个带有一些虚拟文本的文件,并尝试进行另一个提交,只有该文件出现在修改列表中。所以它似乎运行得相当不错!

再次说明,我以前没有在实际生产中使用过这个功能,如果我错了,请指导我。我也很想知道这是否是正确的方法,因为我可以看到自己在(不久的)将来需要它。

-戴夫


这只会将您的工作副本更新到旧版本,并且无法像上面提到的那样提交。 - Sander Rijken
你确定吗?我已经在测试环境中尝试过了,看起来提交没问题。但是我可能错了。 - user50384
如果文件在r24之后有过修改,而你又对其进行了修改,则svn将无法提交任何更改,并要求你先更新到HEAD。 - Wim Coenen

0
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"

0

以下是我开始进行的方式。很残忍,但这是唯一可以完全忽略冲突并保持修订历史记录完整的方法。

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

注意,这不是我认为的“正常”方式,正常的方式是从旧版本创建一个分支,然后将该分支合并回主干。 (至少,以前是这样的)

编辑:上面的代码未经测试,请勿直接运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接