16

我有一个 DOS 批处理文件形式的自制自动构建脚本。在该脚本的一部分中,我检查了(使用“svn checkout”)我们 SVN 存储库的一部分,其中包括我们项目中使用的一堆第三方内容。这个批处理文件在很长一段时间内运行良好,但是现在人们已经将大量的绒毛(文档、示例代码等)签入到第三方区域,并且该脚本的签出部分变得慢了很多。我想通过只检查我们需要的东西来缓解这种情况——在我们的例子中主要是 dll 文件。所以,我的问题是:检查按文件扩展名过滤的 SVN 存储库的最佳方法是什么?

我在 svn 帮助中没有看到任何明显的方法来做到这一点。我有一个以某种方式包装 svn.exe 的 .NET 实用程序库,我正在考虑扩展它以仅检索与我感兴趣的扩展匹配的内容。但如果存在,我更愿意使用更简单或现有的方法。

4

6 回答 6

34

这是可能的:您可以svn checkout创建一个空目录,然后为svn update filename想要的每个文件。

您的脚本可以执行以下操作:

  1. svn checkout svn://path/to/repos/directory --depth empty
  2. svn list --recursive svn://path/to/repos/directory
  3. 通过删除禁止文件扩展名的过滤器将结果管道化,例如grep
  4. 遍历这个新的过滤列表和svn update --parents每个文件

这将为您提供没有某些文件或文件扩展名的工作副本的所需结果。

当然,还有你提到的“人们[检查]很多绒毛”的问题,但这是另一回事。

于 2010-01-07T21:47:48.407 回答
3

正如我在这里所说,SVN 本身只有一个选项:SVN 1.5 中的一个新功能称为sparse checkout,但是您只能在目录级别选择签出,因此您必须在不同的目录中对不需要的文件进行排序.

于 2008-10-10T20:00:16.393 回答
0

您不能只签出几个特定文件 - 您只能签出整个文件夹。您可以重新安排您要签出的内容的组织,或者您可以从其他地方复制一份工作副本并进行更新。

于 2008-10-10T19:57:04.730 回答
0

对于Michael Hackner答案的 powershell 特定实现,请尝试以下操作:

svn ls http://svn-server/src --recursive | Out-File svn.txt
Get-Content .\svn.txt | where {$_.toLower().EndsWith('special.xml')} | select -First 200 | foreach {New-Object PSObject -Property @{ Path = $_; Munged = $_.Replace('/', '_') } } | foreach { svn export "http://svn-server/src/$($_.Path)" $($_.Munged) }

我在这里的特殊用例是找到一堆名称相似的文件(在本例中为 *special.xml),并将它们全部转储到一个文件夹中,具有本质上唯一的名称。我已经使用了一个中间文件来存储整个 repo 列表,但如果这对你更好,这也可以内联。

于 2015-10-07T01:20:41.077 回答
0

我刚刚尝试了 Michael Hackner 提出的方法。下面是 DOS 系统的实现。请注意,您必须在运行此脚本之前签出空文件夹。

@echo off

svn list --recursive https://path_to_repository_folder | find /I ".sql" > filelist.txt

REM Specify a custom delim. Otherwise space in filename will be treated as a delimiter.
FOR /F "delims=|" %%i  IN (filelist.txt) DO (
    echo -------------
    echo %%i
    svn update --parents "%%i"
)
于 2017-04-21T01:12:02.427 回答
-4

最简单和正确的方法:不要这样做!

如果第三方文件夹中有一些废话,假设有 .dll 文件需要结帐 - 将这些废话移到其他位置!无论如何它不属于这里。

于 2008-10-10T20:15:11.637 回答