1

我的 SVN 存储库包含用于不同项目的多个文件夹。'Desktop program''iOS app''Web app'等。所有修订条目都在它们之间共享(因为它在一个存储库下。修订#100 可能在'iOS app'文件夹中,修订#101 在'Web app'文件夹等)。

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

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

4

2 回答 2

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-> repo

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

于 2012-11-10T00:46:51.637 回答
1

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

太糟糕了...为了将WC-tree 的一部分返回到以前的修订版中,您必须cd SUBTREE-ROOT & svn up -r REVNO(从 WC-root 提交此修改后的 WC将在 repo 中创建带有部分回滚树的新修订版)

没有人应该再次能够检查这 20 个提交,因为它们“从未发生过”

Cheated and rewritten history in SCM is BAD IDEA. And Subversion history is immutable, you have to change history using svnadmin tools and access-level, as @petr-kozelka wrote

于 2012-11-10T00:57:52.920 回答