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 ls
是svnlook 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文件)是特别有用的。