SVN检出时如何按文件扩展名进行过滤?

16

我有一个自制的自动化构建脚本,是一个DOS批处理文件。在脚本的一部分中,我使用“svn checkout”命令检出我们的SVN存储库中包含的一些第三方内容,这些内容用于我们的项目。这个批处理文件的性能一直不错,但现在有很多无关的杂项(文档、示例代码等)被人们提交到第三方区域,导致检出这部分脚本变得非常缓慢。因此,我想通过只检出我们需要的内容来减轻这种情况——在我们的情况下,主要是dll文件。那么,我的问题是:如何按文件扩展名过滤检出SVN存储库中的内容?

我在svn的帮助文档中没有看到任何明显的方法来实现这一点。我有一个.NET工具库,可以在某些方面上封装svn.exe,并考虑扩展这个库以仅检索与我感兴趣的扩展名匹配的内容。但如果已经存在更简单或现有的方法,我更愿意使用它。


这个问题过于局限。该问题涉及第三方svn添加。 - AlxVallejo
1
@AlxVallejo 不是的,它指的是svn.exe。 - Chris Farmer
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
这将提供所需的结果,即具有某些文件或文件扩展名的工作副本。
当然,还有您提到的“人们上传许多无用文件”的问题,但那是另一回事。

1
你可能也想看看ant的subversion支持: http://subclipse.tigris.org/svnant/svn.html - tonyo
1
这个实现看起来是什么样子的? - Pup
2
我尝试自己实现这种方法,但我认为我做错了。我遇到了跳过路径冲突的问题。 - aaaantoine
使用@Pup获取所有文本文件,#2-#4是一行代码... svn up \svn list svn://svn.foo.com:3690/svn/somerepo/somedir/ | grep txt`... 您只需在反引号中使用#2即可使用txt文件列表的结果直接进行svn up[date]`。 - stevesliva

3

如我在这里所说,SVN本身只有一个选项:在SVN 1.5中引入的新功能sparse checkout,但是您只能选择目录级别的检出,因此必须将不需要的文件排序到另一个目录中。


2
感谢指出稀疏目录 - 它们是非常强大的功能。对于所有感兴趣的人,http://bit.ly/99Nblk 是svn-book中相关章节的链接。 - Victor Farazdagi
换句话说,没有办法按扩展名筛选svn checkout。 - AlxVallejo

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"
)

0

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


-1

对于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 列表,但如果对您更好,这也可以被内联。


-4

这是最简单也是正确的做法:不要这样做!

如果第三方文件夹中有些垃圾,本来应该是.dll文件需要检出,那么将这些垃圾移动到其他位置!它们根本不应该存在于此处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接