想要从我的SVN存储库中删除修订


33

我的代码存储库中的最新修订已损坏,并破坏了我的应用程序的稳定性。我想恢复到较早的版本。

但是我不想在我的工作副本上简单地使用“还原”。实际上,我实际上想删除我的仓库中的主要修订版本和多个修订版本,从而将我的仓库“还原”到一个较早的修订版本,该版本将成为主要修订版本。有人知道我会怎么做吗?


1
正如Felix所提到的,您无法真正删除旧修订,只能做的就是撤消更改并提交。有趣的旁注,Git的(以及其他的版本控制解决方案),实际上没有让你真正删除修订..
davr

3
是的,您可以,您只需要使用svnadmin访问SVN存储库。请参阅下面的答案。
马丁

davr在技术上是正确的。您所描述的是转储除不良修订之外的所有修订,然后将其转储到旧版本库的顶部。在我看来,这与“删除”修订本不一样。
Sirex

Answers:


12

也许此链接可以帮助您:

http://www.sampablokuper.com/2009/03/27/svn-revert-to-revision/

引用:

  1. 转到工作副本中的顶层目录(假设您要回滚整个工作副本)。

  2. 运行svn revert以将工作副本的文件恢复为上次提交/签出时的状态。

  3. 运行svn status -v以查看您的工作副本现在对应的修订号(这是svn status -v产生的列表中的最高修订号)。

  4. 运行svn merge -rXX:YYwhere XX是您在上一步中获得YY的编号,并且是您要还原到的修订版的编号。

  5. 做完了!可能的例外是,工作副本中YY最初进行修订时不存在的文件仍会存在,因为默认情况下svn不会删除内容。如果要摆脱它们,请svn del [filename]对它们中的每个运行一个。

  6. 做得好!现在,就像所有这些中间编辑从未发生过一样,使用您的工作副本。当您准备好做出自己的努力时,只需照常使用svn commit即可!


1
在Windows Os中,选项#4运行svn merge -rXX:YY .请记住在行的末尾放置一个点以引用当前目录。在TortoiseSVN中,有一个反向合并的选项。
Shantha Kumara

3
实际上,这并没有还原为“较早的版本,它将成为主要版本”。它不会使旧版本成为HEAD。而是,它创建一个新的HEAD。参见马丁的答案。
马修·弗拉申

我修改了答案,以包含Shantha关于尾随期的评论。* nix上也是如此。
Mike Kormendy'2

72

这对我有用。假设您将1234修改为HEAD,并且您想还原最后三个提交:

svnadmin create newrepo
svnadmin dump -r 0:1231 repo | svnadmin load newrepo
mv repo oldrepo
mv newrepo repo

12
+1。您是唯一一个既理解问题又给出具体答案的人。
马修·弗拉申

6
从技术上讲,这是正确的答案。应该指出的是,这除了可能做起来相当复杂之外,还将使所有已检出的副本无效-因此,您需要提醒任何也在使用该存储库的人。
sleske

1
快捷,简单,而且实际上是发帖人的要求。
2013年

7
只要您确保还将存储库UUID复制到新存储库中(请参阅“ svnadmin setuuid”,从旧存储库中“ svn info”中的UUID复制),仅将签出更新为要删除的修订版无效。
Bryan Petty

1
在新的存储库上,您可能需要修复文件许可权或将其复制到hooks / conf目录中的文件中
AdamS

5

我知道这是一个古老的问题,但是,我刚刚找到了如何使用Windows / TortoiseSVN执行此操作。

如评论所建议,您不能“删除”一个修订,但是您可以做的是制作一个与您要还原到的修订相同的最新修订。

  1. 在存储库的HEAD上签出要从中还原修订版的目录。
  2. 在TortoiseSVN中将“显示日志”视图加载到要还原的最高级别目录(例如“ Trunk”)中。
  3. 右键单击要删除的修订版注意:这是要删除的修订版,而不是要还原到的修订版。
  4. 选择“从此修订版本还原更改”。
  5. 在提示符下单击“是”。
  6. 正常更新结帐,但更新为“ HEAD”。
  7. 提交回来。

然后,您将转到已签出的其他所有人,并让他们进行更新,并确保删除所有新文件。

另外,您需要确保每个人都知道该修订是什么,并有可能更新描述。


与正常的“还原”程序有何不同?
Tomer W

Revert只是将您的工作副本更改为仓库中的内容。这是如何使报表的HEAD反映任何先前提交的状态。
马丁

1
谢谢您这样做-乌龟SVN方式正是我恢复错误提交所需要的:)
Dr. Andrew Burnett-Thompson

在“日志”窗口中,还有一个上下文菜单项“ 还原为该修订版 ”。
Uwe Keim

4

您可以为此目的使用转储/加载。

您也可以使用svnsync进行某个版本的备份。

如果您的存储库很大,则需要一些时间。


3

对我来说(VisualSVN,30-HEAD)可以做到这一点:

  C:\ Repositories \ MyRepo \ revs \ 0 \ 30
  C:\ Repositories \ MyRepo \ revs \ 0 \ 29
  C:\ Repositories \ MyRepo \ revs \ 0 \ 28
  C:\ Repositories \ MyRepo \ revprops \ 0 \ 30
  德尔C:\ Repositories \ MyRepo \ revprops \ 0 \ 29
  德尔C:\ Repositories \ MyRepo \ revprops \ 0 \ 28
  回声27> C:\ Repositories \ MyRepo \ db \ current
  


这比其他答案好吗?
Toto

它要快得多。
安东·古利霍夫

0

转到终端并导航到svn代表:现在键入

svn update -r“您要还原的修订号”


2
欢迎来到超级用户!请仔细阅读问题。您的答案没有回答原始问题。OP表示“我不想在我的工作副本上简单地使用'revert'”
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.