2010-09-26 124 views
1

请考虑以下情形:
1.用户A创建并提交文件(可以说file1.txt)。
2.用户B从存储库中删除此文件。
3.用户A在其本地工作副本中有该文件,并希望将其恢复。用户发现在之后已完成Update()SharpSvn:恢复已删除文件的正确方法

实现此目的的正确方法是什么?

到目前为止,我已经尝试过:
- Client.Revert()其次是Update但我看不到变化。
- Client.Merge(local_working_copy, SvnUriTarget_of_repository, revision_range_between_the_previous_and_new) - 仍然没有改变。
- Client.DiffMerge(),其中目标路径是文件的本地路径,merge_from是存储库中具有以前版本号的路径,merge_to是具有新版本的本地路径。 - 我收到一个异常,说该文件不受版本控制。它不能被添加,因为它不再存在于本地。当我将目标路径替换为版本库路径时,我收到一个异常,说这不是一个工作副本。

请帮帮忙,
诺亚

+0

好吧,我想我已经部​​分地发现了它 - 我可以使用带有所需版本号的Update()。这将文件恢复到工作副本,但即使我再次提交,它看起来过时了,如果我再次更新,它将再次被删除。 – Noich 2010-09-26 09:10:51

回答

-2

对于别人谁可能需要这一点,并与SVN没有以往的经验:

在运行时更新,使用this useful answer订阅Update()事件。这样你就可以保存被删除文件的所有名字(或其他任何你感兴趣的动作)。

然后,Update()完成后,您可以使用Copy()如下:
Copy(new SvnUriTarget(path/to/file/in/repository, new SvnRevision(the_old_revision_which_had_the_files)), local/path/to/file);

现在所有剩下的就是Commit()文件(县)回资源库,就大功告成了:)

Noa

+0

但是'拷贝'回来的东西实际上是一个坏主意。你要恢复的文件 – 2010-10-11 21:56:48

+0

正如我所提到的,我以前没有使用Svn或SharpSvn的经验,这是迄今为止我发现的最好的,但如果你想发布一段代码来替换'copy'动作,我我真的很感激它。请记住,我需要删除的文件成为新版本的一部分,仅此而已。谢谢! – Noich 2010-10-12 10:16:31

2

你应该反向版本的属性,因为你扭转了合并。这意味着你必须创建一个SvnRevisionRange像:

new SvnRevisionRange(newRevision, oldRevision); 

当您从旧到新的使用,你想再次申请同一变化(这是一个空操作,因为它已经发生)。

+0

好吧,这确实使一个不同的,但它也删除其他文件已添加,并状态检查仍然显示恢复的文件过时:(谢谢你的答案,虽然。 – Noich 2010-09-26 09:25:54

+0

你也可以恢复只是文件,而不是整个工作拷贝为了做到这一点,通过一个带有Uri和修订版的SvnUriTarget(修订版可以是oldRevision,它是指示你需要什么文件) – 2010-09-26 10:07:59