SVN:您是否可以从本地签出中删除目录(而不是从存储库中删除)?

时间:2009-09-17 14:17:05

标签: svn

假设您在subversion控件下有一个目录,其中包含一些文件和大量子目录,如下所示:

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

现在您需要文件和一些目录,但不是全部。这可以通过SVN完成。只是使结账非递归:

svn checkout -N <URL>

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

svn up dir2
svn up dir4

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

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

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

即使是SVN 1.5的新稀疏目录(“浅层结账”)功能也没用:

  

Subversion 1.5的实现   浅的结帐是好的,但没有   支持一些有趣的   行为。首先,你不能   取消望远镜工作副本。   运行svn update --set-depth为空   在无限深度的工作副本中   没有丢弃的效果   除了最顶层的一切   目录 - 它只会出错。   
- http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

SVN完全不可能吗?有人曾想出过一个聪明的工作吗?

只需创建checkout目录(没有SVN),然后直接从存储库中检出单个子目录作为此目录的子目录将适用于目录:现在每个目录都是自己的结帐,可以更新,一次不能需要更长时间,你可以删除它。但是,如何获取文件(例如file1.txt)? SVN不允许签出单个文件,只能签出整个目录。

5 个答案:

答案 0 :(得分:56)

Subversion 1.4或Subversion 1.5无法完成我想做的事情。期间。周围没有解决方法,就是这样。

可以使用Subversion 1.6完成。

与SVN 1.5不同,SVN 1.6可以减少目录

上的深度
svn up --set-depth exclude dir2

是解决方案。它将dir2的深度设置为零,并且它将立即从结帐中消失,并且没有更新会将其恢复,除非您再次明确地将此目录的深度设置为某个值(或者只是在没有深度选项的情况下对其进行更新,因为不给予任何深度总是意味着无穷大,除非你使用非递归,这​​意味着“文件”)。

提示:
实际上SVN 1.6无法真正减少深度,就像增加深度一样。您可以将它从任何级别增加到任何更高级别。您只能将其缩小为“排除”(所有的最低级别)。如果要从“无限”(最高)减少到“文件”(中间的某个位置),必须首先将其缩小为“排除”(导致目录消失),然后再将其再次增加回“文件”。这有点像黑客,但它的效果很好。

答案 1 :(得分:37)

对于之后遇到此问题并使用 TortoiseSVN 的任何人,以下是如何做同样的事情......

  1. 右键单击不再需要签出的文件夹(这是您要排除的文件夹)
  2. 从上下文菜单中选择“TortoiseSVN&gt; Update to Revision ...”
  3. 在弹出的窗口中,将“更新深度”下拉框设置为“排除”
  4. 点击“确定”。 SVN将自动从您的驱动器中删除该目录。
  5. (注意:这是使用TortoiseSVN 1.7.5完成的,并且可能因其他版本而异。)

答案 2 :(得分:10)

更新:我正在运行SVN 1.6.11并且我能够使用svn up --set-depth empty dir解除望远镜,而不是必须exclude目录。

答案 3 :(得分:2)

使用svn 1.6,--set-depth就是答案。

使用svn&lt; 1.6,您可以通过滥用svn switch来获取稀疏检出:在您的存储库中的某个位置创建一个空目录,并且switch您现在不需要的子目录指向它而不是它们的“真实”URL

答案 4 :(得分:1)

您可以尝试使用本地存储库和svn: externals 声明的trick

虽然没有尝试过。