我正在检查一个包含外部的 SVN 存储库(svn:externals 属性)。
但是,显然,如果我将 --depth 与“infinity”以外的任何值一起使用,则不会下载外部文件。这尤其具有讽刺意味,因为显然可以稍后使用 --set-depth exclude 和 exclude 文件夹进行更新。
是否可以有选择地签出并包括所有外部项目?
我正在检查一个包含外部的 SVN 存储库(svn:externals 属性)。
但是,显然,如果我将 --depth 与“infinity”以外的任何值一起使用,则不会下载外部文件。这尤其具有讽刺意味,因为显然可以稍后使用 --set-depth exclude 和 exclude 文件夹进行更新。
是否可以有选择地签出并包括所有外部项目?
我有同样的问题,除了事后手动检查外部的解决方法外,我没有任何真正的答案。
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,并在其中注明
这是一个明确定义的功能。(有代码检查这种情况,然后显式跳过处理)
(但是,问题没有关闭,仍然有Status: NEW。)
而且我无法找到这个“功能”的任何明确原因,我只找到了通过将旧选项的检查与检查交换来引入它的提交,我会说这有点太严格了,但它有从那以后基本上就一直呆在那里。--non-recursive
depth == svn_depth_infinity
我遇到了同样的问题,我没有解决方案,但我想我至少找到了部分解决方法。
首先,我想解决 David W 关于为什么这是一个问题的问题。我理解他从哪里来的想法,如果您选择要结帐的特定目录,您可能会假设您不希望任何其他目录签出,因此没有外部目录。
但是,情况并非总是如此。例如,我们有多个开发项目都与第三方包相关。我们有一个目录,其中有一个外部目录链接到第三方产品存储库,然后在与该目录相同的级别,我们为我们开发的与该第三方项目相关的不同项目提供单独的目录。在任何给定时间,我可能只想处理我们的一个项目,而我不想查看其他十几个项目,但是我们所有的项目都有相对路径引用“返回”到第 3 方项目目录。所以,每当我签出我们的一个项目时,我都想确保第三方项目的外部链接也被签出。
这是我们商店中的场景,我们需要稀疏结帐,但我们希望也可以签出附加到稀疏结帐链中任何目录的任何外部文件。
现在,对于部分解决方法....
我发现,在我使用 TortoiseSVN 进行初始稀疏检出之后,(它没有得到我的外部)如果我然后转到命令提示符并在外部属性关联的目录上方的目录中执行以下命令with(尚不确定该事实是否相关,但认为值得一提,因为其他人说他们使用 svn up 没有得到类似的结果):
svn up --depth infinity
它会检查我的外部文件(请注意,当我选择稀疏结帐开始时,它没有拉下我没有选择的任何目录)。所以这让我到达了我想去的地方。
这是“更好”,但绝对仍然不完美。
作为一种变通方法,我使用了一些 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 externals 中,它的意思是“同一存储库的根目录”。
在我的用例中,我还必须检查某些外部而不是其他,这就是我寻找特定外部的原因。您当然可以循环遍历外部的所有行,并为所有这些行创建稀疏结帐。
As a workaround, I created a folder with the same name as the external folder, then defined the externals inside this. Then the folder is available for selective checkout.
示例: svn co --depth immediates 预期:创建根目录下的所有文件,并为根目录下的每个目录创建一个空目录。实际:根目录下的所有文件都创建完毕,根目录下除 externals 之外的每个目录都创建一个空目录。
我想我理解你的问题,但我不确定这是怎么回事。svn co --depth
and的目的svn update --set-depth
是允许您进行稀疏检出,从而允许您操作存储库结构,而无需检出您真正不感兴趣的千兆字节文件。
以下是使用稀疏结帐的两个示例:
作为一名 CM,我有时会参与我们几乎所有的项目。在我的系统上,我做了一个svn co --depth=immediates $REPO/trunk
可以让我看到我们所有的项目在主干下,但它不使用很多磁盘空间,也没有花那么长时间结帐。然后我可以进入需要我关注的项目并做一个svn up --set-depth=infinity
得到那个项目。像这样检查整个存储库可以让我操纵我们的项目(重命名它们,删除过时的项目等)。
在我的上一份工作中,我在 CVS 到 SVN 转换后重构了我们的分支和标签。创建了数千个完全没有意义的分支和标签。我做了一个svn co --set-depth=empty $REPO
然后 `svn up --set-depth=immediates 分支标签。现在我有了一个包含所有标签和分支的目录,但它们下面没有文件。我可以删除过时的分支和标签,并将它们重命名为更有意义的名称。
你抱怨的是,如果我做 a svn checkout --depth=immediates
,我不会得到一个空的externals 目录。但是该目录实际上并不存在于您的项目中。这只是 Subversion 执行的魔术。空的外部目录有什么用?
作为一名 CM,我是少数进行稀疏结账的人之一。这不是大多数开发人员通常会做的事情。当我进行稀疏结帐时,我真的不想看到外部目录。如果出于某种原因,您需要知道外部目录存在的位置,您可以执行svn plist -vR svn:externals .
并获取完整列表,然后执行svn up --set-depth=infinity $extern_dir
.