只有完全递归结账包括外部

时间:2013-04-08 11:56:35

标签: svn

我正在查看包含externals(svn:externals属性)的SVN存储库。

但是,显然,如果我使用--depth除了'infinity'以外的任何值,则不会下载外部。这是特别具有讽刺意味的,因为显然以后可以使用--set-depth排除和排除文件夹进行更新。

是否可以选择性地检查包括所有外部?

4 个答案:

答案 0 :(得分:5)

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

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问题跟踪器中报告为Issue 3311,其中注明了

  

这是一个明确定义的功能。 (有代码检查这个条件然后明确地跳过处理)

(但问题尚未解决且仍有状态:新。)

我无法找到这个“功能”的任何明确原因,我通过检查旧--non-recursive选项并检查depth == svn_depth_infinity来找到the commit which introduced it只有{{3}}我会说,它有点过于严格,但从那时起它基本上就一直存在。

答案 1 :(得分:2)

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

首先,我想谈谈David W关于为什么这是一个问题的问题。 我知道他来自哪里,如果你想要选择要结账的特定目录,你可能会认为你不想要任何其他目录检查出来,没有外部。

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

这是我们商店的场景,我们需要稀疏结账,但我们希望检查附加到稀疏结账链中任何目录的任何外部因素。

现在,部分解决方法......

我发现使用TortoiseSVN进行初始稀疏检查后,(如果我没有得到我的外部代码),如果我转到命令提示符并在目录上方的目录中执行以下内容外部财产与之相关(不确定这个事实是否相关,但认为值得一提,因为其他人说他们没有使用svn获得类似的结果):

svn up --depth infinity

它会检查我的外部(请注意,当我选择我的稀疏结账时,它没有下拉我没有选择的任何目录)。这让我得到了我想去的地方。

这是"更好"但绝对不是完美的。

答案 2 :(得分:0)

作为一种解决方法,我使用了一些cmd / bat windows shell脚本来读取外部定义并创建其缺少的结帐。这有点像@Mormegil的回答,除了我读取外部的URL而不是硬编码。

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%

此示例假定外部定义在svn:externals属性中以此格式给出:

^/elsewhere/foo@123 myExternalName

我必须在我的脚本中添加^^来解决^是windows cmd中的转义字符这一事实。在SVN外部,它意味着“同一存储库的根”。

在我的用例中,我还必须检查某些外部而不是其他外部,这就是我寻找特定外部的原因。当然,您可以循环遍历外部的所有行,并为所有行创建稀疏检出。

答案 3 :(得分:-1)

  

示例:svn co --depth immediates预期:创建根目录中的所有文件,并为根目录中的每个目录创建一个空目录。实际:创建根目录中的所有文件,对于除根外部之外的根目录中的每个目录,都会创建一个空目录。

我想我理解你的问题,但我不确定这是怎么回事。 svn co --depthsvn update --set-depth的目的是允许您执行稀疏检出,这样您就可以操作存储库结构,而无需检查您真正不感兴趣的千兆字节文件。

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

  • 作为一名CM,我几乎在所有项目中工作过。在我的系统上,我做了一个svn co --depth=immediates $REPO/trunk,它允许我在trunk下看到我们所有的项目,但是它没有占用大量的磁盘空间而且结账时间不长。然后我可以进入需要我注意的项目并执行svn up --set-depth=infinity来获得该项目。像这样检查整个存储库允许我操作我们的项目(重命名它们,删除过时的项目等)。

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

您抱怨的是,如果我执行了svn checkout --depth=immediates,我就无法获得 外部目录。但是该目录实际上并不存在于您的项目中。这只是Subversion执行的一个魔术。什么是空的外部目录?

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