如何在Subversion中删除一个文件夹的一个版本

3
我有几个项目存储在我的代码库中,每个项目都有自己的文件夹。是否可以删除其中一个项目的最后一次修改,而不改变其他任何内容?
例如:项目A的最新版本是提交的50个修订版。其他项目继续进行工作,现在代码库已经到达60个修订版。
现在A的用户回来了,并要求删除最后一个版本的更改,因为它们对他没有用。他想回到以前的版本,并且所有进一步的更改都应该从那里开始。
此时,我希望50个修订版消失,以便项目A可以像50个修订版从未发生过一样继续。
我唯一能想到的方法是创建一个分支,从现在开始在该分支上工作。但这只会随着时间的推移创建许多分支,并使项目的历史记录变得混乱。
对于这种情况,有什么好的解决方案?

这个问题的正确答案取决于修订版51-60是否包含了对您的文件所需且应该保留的更改,还是后续修订版是针对不相关的文件进行的,因此并不重要。如果是前者,则需要合并,如果是后者,则可以直接还原。 - Gabriel Hurley
通过"revert",我相信SVN术语是"返回到修订版本"。 - Gabriel Hurley
实际上,想让我们执行的是“svn merge -r 60:50 path”。 - Paul McMillan
5个回答

9
简短回答,你不能真正从Subversion库中删除提交。这是有意为之的,实际上非常困难。
实践上,可以将该目录还原到第49个版本,然后将其作为第61个版本提交。
关键是只恢复涉及的目录,而不是整个检出。
以下是相关SVN书籍链接:http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-4-sect-4.2 您需要一个形式为“svn合并-r 60:50 xxx://path”的命令。

如果你只是这样做,你会失去在版本50-60中所做的一切。我认为这不是OP想要的! - Gabriel Hurley
你可以只还原你感兴趣的单个项目,不需要全部操作。 - Ian
您可以还原单个文件或目录及其所有子目录。如Paul所说,还原后只需执行提交即可,无需为合并等问题烦恼。 - elmuerte
3
如果你还原这个文件,你将会失去自那个版本以来所做出的任何其他修改!因此需要查看已经改变了什么并进行合并! - Gabriel Hurley
SVN书籍中的章节非常好地解释了它。 - sbi

5
  1. 进行更新以确保您的工作副本是最新的。确保您的工作副本没有未决的修改。
  2. 右键单击项目工作副本的根文件夹,选择“显示日志”
  3. 选择要撤消的修订版本(使用ctrl/shift可选择多个)
  4. 右键单击所选修订版本并选择“还原这些修订版本的更改”
  5. 检查撤消操作对您的工作副本所做的修改。如果需要,请解决任何冲突。
  6. 提交修改

目前已经接受的Gabriel Hurley的答案没有意义:在执行“更新到版本”操作后无法提交。该操作会回滚您的工作副本所基于的BASE修订版本。当尝试提交更改时,Subversion会抱怨文件和文件夹已过期。

您需要使用“还原到修订版本”或“从修订版本还原更改”的功能,而不是“更新到版本”。


2
你需要回到第50个版本(使用“更新到版本”),获取文件的状态,然后将其与当前版本重新合并如果有任何你想保留的后续更改。否则,你只需执行更新到版本,然后重新提交文件即可。
没有自动完成此操作的方法,但通过一些手工操作是可行的。这就是版本控制的魔力所在。

1

如果您想撤销某个更改,而不影响同一文件夹中发生的其他更改,那么所有其他答案都是很好的。

如果我正确理解了您的用例,您不必担心项目A上的其他更改,因为没有其他更改。 您只需要将项目A恢复到第50个版本之前的状态即可。 如果是这种情况,则有一个更简单的解决方案(比进行合并和冲突解决要简单得多):

svn del full://url/to/project/A
svn cp full://url/to/project/A@49 full://url/to/project/A

这基本上是将项目A的当前HEAD从存储库中“删除”(它仍然在历史记录中),然后复制一个旧版本的项目(从有问题提交之前)进行替换。

此过程如此透明,以至于如果拥有A的检出副本(从修订版50或更高版本)的人执行svn update,他们将轻松地更新到最新版本,无需进行任何麻烦的合并。


1

如果您确实想要更改51:60

svn merge -r 50:49 A/trunk/
#the most painful experience in your life
svn commit -m "reverting to rev49"

请注意,这通常不起作用。
如果您确实想要更改 51:60,可以使用手动方式。
svn diff -r 50:49 A/trunk/
#review changes from the diff and apply them. or patch.
svn commit -m "reverting to rev49"

请注意,如果您只想删除单个修订版本,则 svn merge -c-49 A/trunk/ 是合并的快捷方式(还要注意修订版本号前的否定形式)。 - John Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接