SVN:只检出/导出目录结构

有没有办法执行一个SVN签出(或导出),这将提取目录结构 ; 也就是说,没有文件?

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' 

这对于任何太大的事情都会很慢。

你可以指定checkout命令的非recursion ,可能会帮助你得到你想要的。

在subversion的contrib工具中有一个python脚本 ,它用空文件创build目录结构。 有了一点python知识,根本不应该很难跳过创build文件。

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

仅用于检出目录结构是部分解决方法,不能排除一个或多个目录被检出。 假设检查目录树的成本与检查完整源相比是微不足道的。 随着版本化的目录结构检出,我可以使用Subversion的更新和稀疏目录来select哪些目录树应该有文件。

这完美的作品

 svn ls | xargs svn up -N 

然后,如果你想得到这些目录完全检查出来,进入他们的内部使用

 svn ls | xargs svn up 

只是想添加,如果你需要做这个服务器端(即不首先检查存储库),相当于svn lssvnlook tree --full-paths 。 我必须创build一个50GB的repo文件夹结构的副本,并使用我在这里find的提示,而无需创build整个工作副本。

我的代码是:

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

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

在Windows和TortoiseSVN你可以做结帐 – >结帐深度:只有这个项目。 这样你可以得到单个文件夹/文件。 你可以用这种方式重build你的结构(使用repobrowser)。 有点繁琐,但是如果你的目录结构不是太复杂的话可行。 我比较喜欢这个,通过慢速networking检出数千个小文件(数千兆字节)。

我的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()); } 

您可以使用这个脚本,它将列出回购并在目录中创build结构。

用法: perl checkout-structure.pl repos destdir

回购一定不能成为你回购的根源,也可以精确的一个目录。

无法创build包含突出字符(àéîùç…)的dirs,但可以很好地处理空格。 对于那些有时间的人来说,我认为这是一个编码问题。

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/$_"; } 

我看不出有什么办法可以从svn help co 。 我之前所做的更新从下载库(即供应商分支)的新版本库的东西是删除所有不是.svn文件夹:

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

如果您试图避免必须首先检查这些文件,但效果不是那么高效。

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

这可能不相关,但是可以通过在相关目录中添加svn:ignore 属性来防止文件被sorting。 这对于防止生成的构件(如文档或caching文件)是特别有用的。