SVN:仅签出/导出目录结构

时间:2009-02-11 15:09:23

标签: svn directory-structure

有没有办法执行SVN结帐(或导出),只能获取目录结构;也就是说,没有文件?

12 个答案:

答案 0 :(得分:13)

svn ls -R {svnrepo} | grep "/$" | xargs -n 1 mkdir -p

导出,而不是结帐。

[更新]

结账:

env REPO={repo} sh -c 'svn ls -R $REPO | grep "/\$" | xargs -n 1 svn co --depth=empty $REPO'

对于任何太大的东西,这都会很慢。

答案 1 :(得分:9)

您可以为checkout命令指定 - 非递归,可能会帮助您获得所需内容。

答案 2 :(得分:5)

有一个python script in the contrib tools of subversion,它使用空文件创建目录结构。 有了一点python知识,根本不应该很难跳过创建文件。

答案 3 :(得分:4)

SVN本身不能这样做,但如果您只想导出目录结构,请尝试svn ls -R --xml获取目录结构的XML列表,然后手动重新创建。

答案 4 :(得分:4)

仅检出目录结构的用法是部分解决方法,因为无法排除一个或多个目录被检出。假设与检出完整源相比,仅检出目录树的成本可以忽略不计。在签出版本化目录结构后,我可以使用Subversion的更新和sparse directories来选择性地选择目录树应该有文件。

答案 5 :(得分:2)

这完美无缺

svn ls | xargs svn up -N

然后,如果您想要完全检出这些目录,请进入它们并使用

svn ls | xargs svn up

答案 6 :(得分:2)

只是想添加,如果您需要在服务器端执行此操作(即不首先检出存储库),则svn ls的等效项为svnlook tree --full-paths。 我不得不创建一个50GB repo的文件夹结构的副本,并使用我在这里找到的提示,而无需创建整个事物的工作副本。

我的代码是:

svnlook tree /path/to/repo --full-paths | grep "/$" | grep -v "^/$" | xargs -I {} mkdir -p "{}"

grep -v "^/$"因为输出包含一个/(即文件系统根文件夹),我不想搞砸了。

答案 7 :(得分:1)

在Windows上和TortoiseSVN你可以做Checkout - >结账深度:仅此项目。 这样你就可以获得单个文件夹/文件。你可以用这种方式重建你的结构(使用repobrowser)。 有点麻烦,但如果你的目录结构不太复杂,可行。 我更喜欢在慢速网络上查看数千个小文件(几千兆字节)...

答案 8 :(得分:1)

您可以使用此脚本来svn列出存储库并在目录中创建结构。

用法: perl checkout-structure.pl repos destdir

repos不能是你的回购的根,也可以是精确的目录。

无法创建包含突出字符(àéîùç...)的目录,但可以使用空格。对于那些有时间的人,我认为这是一个编码问题。

<强> checkout-structure.pl:

#!perl

my @dirs;
my $repos = shift;
my $dest = shift;

@dirs = grep { /\/$/ && /^[^\.]/ } `svn list -R $repos`;

foreach(@dirs) {
    s/\/$//;
    chomp;
    mkdir("$dest/$_") or warn $!." trying to create $dest/$_";
}

答案 9 :(得分:1)

我的DotNet(LINQ)方法:

首先,运行svn list命令。并将输出推送到.xml文件。

"svn.exe" list "https://myserver.com:8443/svn/DotNet/src/v40Base/v40/" --recursive --username %USERNAME% --xml >>myfile.xml

然后针对.xml文件运行一些LINQ代码。

    private static void FindSVNDirectories()
    {

        string fileName = @"C:\temp\myfile.xml";

        XDocument xDoc = XDocument.Load(fileName);

        //XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
        string ns = string.Empty;

        //List of directories
        var list1 = from list in xDoc.Descendants(ns + "list")
                    from item in list.Elements(ns + "entry")
                    where item.Attribute("kind").Value=="dir"
                    select new
                       {
                           mykind = item.Attribute("kind").Value,
                           myname = (item.Element(ns + "name").Value)
                       };

        StringBuilder sb = new StringBuilder();
        foreach (var v in list1)
        {
            sb.Append(v.ToString() + System.Environment.NewLine );
        }

        Console.WriteLine(sb.ToString());


    }

答案 10 :(得分:0)

我看不出有一种方法可以通过简要的查看svn help co来做到这一点。我之前为从新版本的下载库(即供应商分支)更新存储库而做的事情是删除不是.svn文件夹的所有内容:

#!/bin/sh
find ./ -type f | grep -v .svn | xargs rm -f

如果你试图避免首先检查这些文件,它并不是特别有效,但它应该有相同的结果。

答案 11 :(得分:-1)

没有办法做到这一点,事实上这是一件有点奇怪的事情,所以现在我很好奇!

这可能不相关,但您可以通过在相关目录上添加svn:ignore property阻止首先进行评估的文件。这对于防止生成的文件(如文档或缓存文件)进行评估特别有用。