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



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

我想要的是仅在其中一个文件夹上回滚到早期版本。通常这是通过"反向"SVN合并来完成的,因为SVN的工作是跟踪所有历史记录,甚至是糟糕的时期。但是,我不希望这样。假设自修订版 #5 以来,我在"iOS 应用程序">上有 20 次提交。我想从历史记录中删除这些内容,并希望该特定文件夹返回到修订版#5。没有人应该能够再次检查这二十个提交,因为它们"从未发生过"。这可能吗?

我有两台不同的机器正在与SVN交互。一台带有VisualSVN的Windows PC和一台带有Subversion的Mac。我将感谢任何一个的解决方案。

从客户端来看,根本没有办法做到这一点。无论是命令行,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重命名为 ->repo

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

我想要的是只在其中一个文件夹上回滚到早期版本。通常这是通过"反向"SVN合并来完成

可怕。。。为了将WC树的一部分返回到以前的某个修订版中,您必须cd SUBTREE-ROOT & svn up -r REVNO(从WC-root提交此修改后的WC将在存储库中创建具有部分回滚树的新修订版)

没有人应该能够再次检查这二十个提交,因为它们"从未发生过">

在 SCM 中作弊和改写历史是个坏主意。Subversion 历史记录是不可变的,您必须使用 svnadmin 工具和访问级别更改历史记录,正如 @petr-kozelka 所写的那样

最新更新