我的SVN存储库包含用于不同项目的多个文件夹。 '桌面程序','iOS app','Web app'等。所有修订条目都在这些之间共享(因为它位于一个存储库下) 。修订版#100可能位于'iOS应用程序'文件夹,'Web应用程序'文件夹中的修订号#101等。
我想要的是回滚到这些文件夹的一个的早期版本。通常这是通过“反向”SVN Merge来完成的,因为它是SVN的工作来跟踪所有历史记录,即使是糟糕的时间。但是,我并不想这样。让我们说自从修订版#5以来我在'iOS app'上有二十次提交。我想从历史中删除这些,我希望该特定文件夹返回到修订版#5。没有人能够再次检查那些“从未发生过”的二十次提交。这甚至可能吗?
我有两台不同的机器,我正在与SVN进行交互。一台带有VisualSVN的Windows PC和一台带有Subversion的Mac终端级别的Mac。我要感谢两者的解决方案。
答案 0 :(得分:2)
从客户端来看,只有无法来执行此操作。无论是命令行,Tortoise还是其他任何客户。
如果您可以访问拥有存储库的服务器帐户,那么就有可能 - 但它非常复杂,可能涉及一项重要的手动工作。
粗略地说,这些是以下步骤:
svn info http://svnserver/svn/repo
- 查看UUID行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所写