SVN:你可以从本地签出只从目录中删除目录吗?

假设你在subversion控制下有一个目录,包含一些文件和大量的子目录,就像这样:

file1.txt file2.txt file3.txt dir1/ dir2/ dir3/ dir4/ : dirXX/ 

现在你需要文件和一些dirs,但不是全部。 这可以用SVN完成。 只要使结账非recursion:

 svn checkout -N <URL> 

这只检出第一个目录和里面的文件。 没有包含子目录。 即使你进入checkout目录并运行“ svn up ”,它只会更新之前检出的文件,它不会添加目录。 您现在可以通过明确更新这些目录来select性地添加所需的目录。 例如,如果您只需要dir2和dir4,则可以进入结帐目录并执行

 svn up dir2 svn up dir4 

如果将来运行通用的“ svn up ”,它只会更新文件和这两个目录,不会添加任何其他目录。

现在的问题是:如果我稍后决定不再需要dir2,该怎么办? 我如何摆脱它? 似乎没有办法这样做,除了删除整个结帐,从头开始。

当你刚刚删除dir2时,下一个“ svn up ”将把它带回来,因为“ svn status ”当然显示它现在丢失(在其名称前面的“!”)。 运行“ svn remove ”当然会将其删除,但在下一次提交时,它也会将其从存储库中删除,这一定不会发生。

即使SVN 1.5的新稀疏目录(“浅结账”)function在这里也没有用:

Subversion 1.5实现的浅层签出很好,但是不支持一些有趣的行为。 首先,你不能取消一个工作副本项目的望远镜。 在无限深度的工作副本中运行svn update –set-depth将不会丢弃除最上面的目录以外的所有内容,而只会产生错误。
– http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

SVN是完全不可能的吗? 有人曾经提出过一个巧妙的工作?

只需创buildcheckout目录(没有SVN),然后从存储库中直接检出各个子目录作为这个目录的子目录就可以用于目录:现在每个目录都是自己的签出,可以更新,一旦不再需要,你可以删除它。 但是,如何获取文件(例如file1.txt)呢? SVN不允许签出单个文件,你只能签出整个目录。

我讨厌回答我自己的问题,这让我感到非常愚蠢。 我更讨厌提供最好的答案,但不幸的是,这里是唯一真正的答案:

我试图做的不能用Subversion 1.4或Subversion 1.5来完成; 期。
没有任何工作存在,这只是它的方式。

不过,它可以用Subversion 1.6来完成。

与SVN 1.5不同,SVN 1.6可以减less目录的深度

 svn up --set-depth exclude dir2 

是解决scheme。 它将dir2的深度设置为零,并且它将立即从结帐中消失,并且没有更新会将其恢复,除非您将该目录的深度再次明确设置为一个值(或者只是在没有深度的情况下进行更新,因为不给任何深度永远意味着无限,除非你使用非recursion,这​​意味着“文件”)。

小费:
实际上,SVN 1.6并不能像增加深度一样来减less深度。 您可以将其从任何级别增加到更高级别。 你只能把它减less到“排除”(所有的最低级别)。 如果要从“无穷大”(最高)降低到“文件”(中间的某个位置),必须先将其减小到“排除”(导致目录消失),然后再次将其增加到“文件”。 这是一个黑客,但它工作得很好。

对于后来遇到这种情况的人来说,使用TortoiseSVN ,下面是如何做同样的事情…

  1. 右键单击不再需要检出的文件夹(这是您要排除的文件夹)
  2. 从上下文菜单中select“TortoiseSVN>更新到修订…”
  3. 在popup的窗口中,将“更新深度”下拉框设置为“排除”
  4. 点击“确定”。 SVN会自动从驱动器中删除该目录。

(注意:这是用TortoiseSVN 1.7.5完成的,可能会因其他版本而异)。

更新:我正在运行SVN 1.6.11,我能够使用svn up --set-depth empty dir取消svn up --set-depth empty dir而不必exclude目录。

您可以尝试涉及本地存储库和svn: externals声明的这个技巧 。

虽然没有尝试过。

用svn 1.6,– --set-depth是答案。

使用svn <1.6,你可以通过滥用svn switch来获得稀疏的结账信息:在仓库的某个地方创build一个空目录,然后switch你不需要的子目录来指向那个“真正的”URL。