Subversion - 检出父目录

10

假设我有这个仓库:

Animal
  Dog
     Beagle
     Hound
     ...

假设我已经将Dog检出到一个工作目录,但我意识到我真正想要检出Animal。

我可以删除我的工作副本Dog,并检出Animal,但是有没有办法在不删除和重新检出的情况下实现呢?

如果我的Dog工作副本具有Animal作为父文件夹,并且我在不删除Dog的情况下检出Animal,我会得到类似于“subversion failed to add directory versioned same name already exists”的消息。

我还在使用Tortoise。谢谢。


3
重新删除并重新检出有什么问题吗?如果您已经进行了更改,请提交这些更改,然后重新开始。 - kajaco
1
没问题。我就是这么做的,而且它起作用了。只是想知道是否有更好的方法,或者有更正确的方法来做这件事。 - Steve
4个回答

4

这是不可能直接实现的。

最简单的方法是删除您的工作副本,然后重新检出 Animal

如果您在Dog中有任何想要保留的更改,请将 Dog 移动到临时位置,检出 Animal,然后将 Dog 复制回 Animal 目录。


2
你正在寻找的是 svn switch,它可以更新你的工作副本以反映新路径。但修改过的文件不会被触及。在 TortoiseSVN 中,右键单击并从上下文菜单中选择“Switch...”。 svn switch 更常见的用例是在源自同一点的分支之间切换,这样你就可以拥有相同代码的不同视图。但你也可以在你的仓库中任意切换路径。

1
但是我的父目录Animal没有被版本控制,所以我无法从Tortoise切换到它,也许可以通过命令行实现? - Steve
1
我感到困惑。如果你的代码库未被纳入版本控制,那么它怎么可能包含Animal这个类?这是笔误吗? - John Feminella
1
我进行了一次复制(分支),创建了Animal。在我的工作副本中,Animal没有.svn目录。这是一个与仓库文件夹同名的文件夹。因此,我的工作目录是仓库结构的精确副本,但我将Dog检出到了Dog。希望这样说得清楚。 - Steve

0

我发现避免从svn服务器下载已经在我的磁盘上的内容,可以使用--depth empty来完成更新或检出。例如:svn co --depth empty Animal ; cd Animal ; svn update --depth empty Dog

总之,目的是将Dog作为一个目录放入Animal/.svn/entries中。

这个"--depth empty"选项可以防止svn下载实际内容,但是svn会创建子目录(在这种情况下是Dog),并且svn会在Animal/.svn/entries中为Dog子目录添加条目。

然后用你已经拥有的副本替换Dog子目录。

你可以通过在Dog中的某个文件中进行修改,然后在Animal目录中执行svn update来检查是否有效。修改后的文件应该从svn服务器下载下来。


Animal中执行svn up时,如果出现以下信息:Updating '.': Skipped 'trunk' -- An obstructing working copy was found At revision 13370. Summary of conflicts: Skipped paths: 1,则表示更新失败。 - Colin 't Hart
很久没碰了,所以不确定问题出在哪里。SVN应该会创建Animal和Dog目录,对吧?所以不应该有阻碍工作副本的情况。另一个想法是,也许自2013年以来,SVN已经发生了变化,所以这个技巧不再适用。 - Alex Robinson

0

是的,您可以映射父目录。

为此,您只需要从“Dog”(子)目录中删除.svn目录并在父目录上执行SVN Update操作。 它将使现有文件成为Versioned副本,并从SVN服务器下载Dog目录的增量内容。

请注意:您应该具有与SVN目录结构完全相同的目录结构。


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