如何在颠覆中回滚并同时清除历史?

时间:2012-11-10 00:03:29

标签: sql database svn tortoisesvn visualsvn

我的SVN存储库包含用于不同项目的多个文件夹。 '桌面程序''iOS app''Web app'等。所有修订条目都在这些之间共享(因为它位于一个存储库下) 。修订版#100可能位于'iOS应用程序'文件夹,'Web应用程序'文件夹中的修订号#101等。

我想要的是回滚到这些文件夹的一个的早期版本。通常这是通过“反向”SVN Merge来完成的,因为它是SVN的工作来跟踪所有历史记录,即使是糟糕的时间。但是,我并不想这样。让我们说自从修订版#5以来我在'iOS app'上有二十次提交。我想从历史中删除这些,我希望该特定文件夹返回到修订版#5。没有人能够再次检查那些“从未发生过”的二十次提交。这甚至可能吗?

我有两台不同的机器,我正在与SVN进行交互。一台带有VisualSVN的Windows PC和一台带有Subversion的Mac终端级别的Mac。我要感谢两者的解决方案。

2 个答案:

答案 0 :(得分:2)

从客户端来看,只有无法来执行此操作。无论是命令行,Tortoise还是其他任何客户。

如果您可以访问拥有存储库的服务器帐户,那么就有可能 - 但它非常复杂,可能涉及一项重要的手动工作。

粗略地说,这些是以下步骤:

  • 获取存储库UUID - svn info http://svnserver/svn/repo - 查看UUID行
  • 转储svn存储库:svnadmin dump /path/to/repo > repo.dump
  • 编辑转储文件以排除提交

    a)在vi中打开并删除不受欢迎的提交

    b)或使用svndumpfilter命令按路径

  • 过滤它们
  • 创建新存储库并将修改后的存储库导入其中:

    svnadmin create /path/to/repo2

    svnadmin load < repo.dump

    svnadmin setuuid /path/to/repo2 THE_ORIGINAL_UUID

现在,检查repo2是否正常工作并具有您期望的内容。如果是,您可以删除repo并重命名repo2 - &gt; repo

请记住,对dumpfile的手动更改极易出错,并且通常很难发现这些错误。做这样的事情通常是个坏主意。

答案 1 :(得分:1)

  

我想要的是回滚到其中一个文件夹的早期版本。通常这是通过反向&#39;完成的。 SVN Merge

可怕......为了将 WC-tree 的一部分还原回某些先前版本,您必须cd SUBTREE-ROOT & svn up -r REVNO(从WC-root提交此修改的WC 将在repo中创建具有部分回滚树的新修订版本)

  

任何人都不应该再次检查这些二十次提交,因为他们从未发生过这样的事情&#39;

SCM中的作弊和重写历史是 BAD IDEA 。 Subversion历史是不可变的,你必须使用svnadmin工具和访问级别来改变历史,正如@ petr-kozelka所写