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

时间:2008-12-31 02:36:48

标签: svn revert

我搞砸了我的SVN存储库,现在需要将整个存储库从版本28恢复到24,并且不想处理差异或冲突。有一种快速简单的方法吗?我已经能够在使用merge命令之前恢复单个文件 - 但在这个实例中,它希望将所有文件从版本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。

再次感谢!

14 个答案:

答案 0 :(得分:26)

查看svnadmin dump / load。它会为您的每个文件版本创建一个文本文件。可以删除某个点上方/下方的所有内容并重新导入。

例如参见Migrating Repository Data Elsewhere

答案 1 :(得分:25)

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

E.g。   svn merge -r 28:24 [svn的路径]

答案 2 :(得分:14)

如果你真的需要擦除文件中存在的'证据',你需要执行上述的svndump / svnload操作。

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

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

svn merge -r 28:24

答案 3 :(得分:14)

如果您有权访问SVN服务器,则只需编辑path/db/current,将要恢复的旧版本号(此处为24)放在那里,然后删除不再需要的修订文件(即25,来自path/db/revs/0/的26,27,28)。在我不小心删除了存储库中的目录之后,至少这对我有用。

答案 4 :(得分:6)

如果你没有使用管理员权限那么你就不能删除任何旧版本但是你仍然可以通过一个非常简单的“svn copy”命令(nickf和JesperE已经提到这个但是以一种相当神秘的方式)非常好地隐藏它们。 / p>

  

svn delete protocol:// svnserver / some / resource
  svn copy protocol:// svnserver / some / resource @ 24 protocol:// svnserver / some / resource

就是这样,修订版25到28已经完全从svn log中消失了。它根本不是黑客攻击,它是一种安全且(几乎没有)记录的功能。

如果“resource”是一个目录,那么您必须从最后一个URL中删除它:

  

svn copy protocol:// svnserver / some / directory @ 24 protocol:// svnserver / some /

(否则你会在里面复制它)

答案 5 :(得分:5)

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

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

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

这是我将如何开始这样做。野蛮,是的,但它唯一可以保证完全忽略冲突保持修订历史不变。

  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 :(得分:1)

你可以svn del最顶层的目录,然后是svn copy它们:

svn copy svnurl@version svnurl 

答案 12 :(得分:0)

我不完全确定这项工作是否因为我还没有在现场制作中使用它,但我刚刚尝试了一个测试库(我复制了一个我的制作版)并且似乎< / em>工作。

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

svn update -r 24 trunk

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

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

同样,我之前没有在现场制作中使用过这个,所以如果我错了请咨询。我也很想知道这是否也是可行的方法,因为我可以看到自己在(近)未来需要这个。

-Dave

答案 13 :(得分: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"