Svn 只有完全递归签出才包括外部

Svn 只有完全递归签出才包括外部,svn,Svn,我正在签出一个包含externals的SVN存储库(SVN:externals属性) 但是,很明显,如果我使用--depth和除“infinity”以外的任何值,则不会下载外部内容。这尤其具有讽刺意味,因为显然以后可以使用--set depth exclude和exclude文件夹进行更新 是否可以有选择地签出并包含所有外部内容 示例:svn co--预期深度立即:创建根目录中的所有文件,并为根目录中的每个目录创建一个空目录。实际:创建根目录中的所有文件,并为根目录中除外部以外的每个目录创建一个

我正在签出一个包含externals的SVN存储库(SVN:externals属性)

但是,很明显,如果我使用--depth和除“infinity”以外的任何值,则不会下载外部内容。这尤其具有讽刺意味,因为显然以后可以使用--set depth exclude和exclude文件夹进行更新

是否可以有选择地签出并包含所有外部内容

示例:svn co--预期深度立即:创建根目录中的所有文件,并为根目录中的每个目录创建一个空目录。实际:创建根目录中的所有文件,并为根目录中除外部以外的每个目录创建一个空目录

我想我理解你的问题,但我不确定这是个什么问题。
svn co--depth
svn update--set depth
的目的是允许您执行稀疏签出,这允许您操纵存储库结构,而不必签出您真正不感兴趣的千兆字节文件

以下是使用稀疏签出的两个示例:

  • 作为一名CM,我曾经在几乎所有的项目中工作过。在我的系统上,我做了一个
    svn co--depth=immediates$REPO/trunk
    ,它允许我查看trunk下的所有项目,但它不占用很多磁盘空间,而且签出也不需要那么长时间。然后,我可以进入需要我关注的项目,进行
    svn-up--set depth=infinity
    以获得该项目。通过像这样签出整个存储库,我可以操纵我们的项目(重命名它们,删除过时的项目,等等)

  • 在我的上一份工作中,我在CVS到SVN转换之后重构了我们的分支和标记。成千上万的分支和标签被创建出来,它们毫无意义。我做了一个
    svnco--set depth=empty$REPO
    然后`svn up--set depth=immediates分支标记。现在,我有了一个包含所有标记和分支的目录,但它们下面没有任何文件。我可以删除过时的分支和标记,并将它们重命名为更有意义的名称

您抱怨的是,如果我执行
svn签出--depth=immediates
,我不会得到一个空的外部目录。但该目录实际上并不存在于您的项目中。这只是一个由Subversion执行的魔术。空的externals目录有什么用


作为一名CM,我是为数不多做稀疏结账的人之一。这不是大多数开发人员通常做的事情。当我执行稀疏签出时,我真的不想看到外部目录。如果出于某种原因,您需要知道外部目录存在的位置,您可以执行
svn plist-vR svn:externals.
并获取完整列表,然后执行
svn up--set depth=infinity$extern\u dir

我也有同样的问题,除了事后手动检查外部的解决方法外,我没有任何真正的答案

mkdir wc
svn co http://example.com/svn/repo/trunk wc --depth=immediates
cd wc
svn co http://example.com/svn/extrepo external --depth=empty
但很明显,这违背了外部的全部目的

在Subversion问题跟踪程序as中报告了此行为,并在此处进行了说明

这是一个明确定义的特性。(有代码检查此条件,然后显式跳过处理)

(但是,问题尚未结束,状态仍然为:新建。)


我无法找到这个“特性”的任何明确原因,我只是通过对旧的
--非递归的
选项的检查与对
深度==svn_depth_infinity
的检查进行交换,我认为这有点太严格了,但从那以后,它基本上一直存在。

我遇到了同样的问题,我没有解决办法,但我认为我至少找到了部分解决办法

首先,我想回答David W关于为什么这是一个问题的问题。 我理解他的想法,如果你选择了你想签出的特定目录,你可能会认为你不想签出任何其他目录,因此,没有外部目录

然而,情况并非总是如此。例如,我们有多个开发项目,它们都与第三方包相关。我们有一个目录,其中有一个链接到第三方产品存储库的外部目录,然后在与该目录相同的级别上,我们为与该第三方项目相关的不同项目开发了单独的目录。在任何时候,我可能只想处理我们的一个项目,我不想检查其他十几个项目,但我们所有的项目都有相对路径引用“返回”到第三方项目目录。因此,每当我签出一个项目时,我都想确保第三方项目的外部链接也被签出

这是我们商店中的场景,我们需要稀疏签出,但我们希望附加到稀疏签出链中任何目录的任何外部也被签出

现在,对于部分解决方案

我发现,在我使用TortoiseSVN进行初始稀疏签出(这不会获取我的externals)之后,如果我在与external属性关联的目录上方的目录中转到命令提示符并执行以下命令(目前还不确定这一事实是否相关,但认为值得一提,因为其他人说他们使用svn up并没有得到类似的结果):

它将签出我的外部文件(注意,当我选择稀疏签出开始时,它没有下拉任何我没有选择的目录)。因此,这让我达到了我想要的位置


这是“更好”,但肯定还不够完美。

作为一种解决方法,我使用了一些cmd/bat windows shell脚本来读取外部定义并创建其缺少的签出。这有点像@Mormegil的答案,只是我读了
svn up --depth infinity
cd folderWithExternal

rem Read line from svn:external and put it in temporary file
svn propget svn:externals  | findstr myExternalName > external.tmp

rem Put content of temporary file in variable
set /p external=<external.tmp

rem Create a checkout for the external. The ^^ is to deal with cmd escaping.
svn checkout ^^%external%
^/elsewhere/foo@123 myExternalName