需要在Subversion中还原已删除的分支


67

我有两个Subversion存储库的工作副本,一个是主干,另一个是我创建的分支。

我不小心在存储库浏览器中删除了该分支。如何还原分支?有没有办法撤消整个存储库的最新提交?

Answers:


80

采用:

svn cp [path to deleted branch]@[revision before delete] [new path]

例如:

svn cp svn://myrepo.com/svn/branches/2.0.5@1993 \
       svn://myrepo.com/svn/branches/2.0.5_restored

1993年是删除之前的修订...

是一些很好的文档...

@用户名中必须有某种转义符号的方式...


似乎没有用,我正在使用svn + ssh,因为它在本地服务器上,所以我尝试了svn cp svn + ssh:// username @ serverip / svn / branches / branch-name @ 9999 svn:ssh:// username @ serverip / svn / branches / branch-name,我得到“版本9998中不存在路径'svn + ssh:// username @ serverip / svn / branches / branch @ 9999'”
路加福音

1
您可以尝试使用svn cp -r 9998 svn + ssh:// username @ serverip / svn / branches / branch-name svn + ssh:// username @ serverip / svn / branches / branch-new-name吗?
约翰·韦尔登

3
你刚刚救了我的命。
Alucard

1
@Alucard我很高兴它有所帮助:)
John Weldon

1
如果不起作用,请添加-m“提交消息”,如下所示:svn cp svn://myrepo.com/svn/branches/2.0.5@1993 svn://myrepo.com/svn/branches/2.0。 5_restored -m“提交消息”
senninha

97

如果您使用的是TortoiseSVN,这是一个解决方案:

  1. 在回购浏览器中,导航到您删除的文件夹的父文件夹(例如,“分支”)。
  2. 右键单击该文件夹,然后执行“显示日志”。
  3. 查找删除特定分支文件夹的修订版。
  4. 选择该修订之前的修订。
  5. 右键单击并选择“浏览存储库”。现在,您正要在删除分支之前的时间点查看存储库的状态。
  6. 找到您删除的分支文件夹,选择,右键单击,然后选择“复制到...”
  7. 现在,您可以将已删除的文件夹复制到新名称甚至相同的名称。

然后,您可以在最新的/主仓库浏览器中转到重命名的分支,然后复制回原始分支名称。然后,该分支的日志历史记录将通过“已还原”分支显示绕道,但可以使用。
亚当

仅供参考,一个不错的附加功能是还可以恢复分支的修订历史记录。您只需右键单击还原的分支,然后单击“显示日志”。然后,如果您取消选中“停止复制/重命名”,它将显示整个分支历史记录。
yellavon 2014年

拯救了我的一天。在重做的边缘工作了大约一个星期。我可以保持相同的名字真是太好了。
artie 2014年

谢谢。完美地提到了步骤。
Noddy先生

由于无意中删除了没有合并到主干中的分支,因此使我免于大量返工。谢谢!
MarkMcDowell_LL

4

假设您的最新修订为108:

svn merge --revision 108:107
svn diff 
svn commit -m "Reverted revision 108"

您还可以将源URL添加到合并中:

svn merge --revision 108:107 http://svn/repo/

堆栈溢出的其他地方: 在TortoiseSVN中撤消提交


这似乎也不起作用。我收到以下错误消息:在修订版108中不存在路径/ branches / branch-name,其中108是删除分支后的修订版
路加福音

1
好。您可能必须结帐/分支机构。您的分支机构很大吗?
leonm

1
对于具有许多分支机构的大型项目,与John Weldon建议的“ svn cp”相比,签出/分支机构的成本相当高。
艾伦·克鲁格

3

我遇到了这个问题,但是上面的命令对我不起作用。做的事情要容易得多。在删除该分支之前,我先对其进行了修订。

删除的修订版是9331。我在9330签出了它:

svn co https://svn.acme.com/svn/giantFlySwatterTargetingSystem/branches/bug1234@9330 restored

那是我想要的简单解决方案。


2
这样,您将使工作副本处于所需状态,但是存储库将保持不变,因此其他开发人员将不会看到已删除的分支(这可能不是您想要实现的)。
安东·古里亚诺夫

1

这对我有用

svn cp-用户名your_user_name https:// path_to_your_repo / branches / Deleted_branch_name @ last_revision_before_deletion https:// path_to_your_repo / branches / new_name_for_branch


1

或者,如果是删除了分支的单个提交,则:

恢复提交,然后提交

svn merge -c -REV .
svn commit -m "Reverting deletion of branch XYZ"

1
假设您已将父母签出作为工作副本。如果父级包含许多文件/文件夹,则可能非常耗时并占用大量磁盘空间。但是,如果使用签出父级--depth immediates,然后与之一起运行指定的merge命令,--depth infinity则可以避免签出整个父级。
ToddR

0

我遇到了同样的问题,并在SmartSVN(Enterprise 6.0.2)中以这种方式解决了这个问题:

  • 打开后备箱/ HEAD上的视图
  • 调用菜单“存储库” /“在存储库浏览器中打开”(分支文件夹中不存在已删除的分支)
  • 在资源库浏览器中,调用菜单“资源库/显示修订...”。
  • 选择删除前的修订版(已删除的分支重新出现在branchs文件夹中)
  • 右键单击已删除的分支,在菜单中选择“复制”,然后为目标输入相同的路径
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.