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'
对于过大的数据,这种方法速度会比较慢。
svn ls -R {svnrepo} | grep "/$" | tr '\n' '\0' | xargs -0 -n 1 mkdir -p
- Robert Fleming您可以使用--non-recursive参数在checkout命令中指定,这可能有助于您获取所需内容。
--non-recursive
就是按字面意思:它不会递归遍历整个树形结构。因此,这只会给你顶层对象,这并不是OP想要的,除非他们有一个扁平的目录结构(像灌木丛而不是树)。 - SQBSVN本身不能做到这一点,但如果您只想导出目录结构,请尝试svn ls -R --xml
,以获取目录结构的XML列表,然后手动重新创建它。
检查目录结构的用途是部分解决无法排除一个或多个目录进行检出的问题。假设仅检出目录树的成本与检出完整源代码相比可以忽略不计。通过检出版本化的目录结构,我可以使用Subversion的更新和{{link1:稀疏目录}}来选择性地选择哪些目录树应该有文件。
这个完美运行
svn ls | xargs svn up -N
如果您想完全检查其中几个目录,请进入这些目录并使用以下命令:
svn ls | xargs svn up
我想补充一点,如果你需要在服务器端执行此操作(即不首先检出存储库),则相当于 svn ls
的是 svnlook tree --full-paths
。
我不得不创建一个50GB存储库的文件夹结构的副本,并使用我在这里找到的提示来完成此操作,而无需创建整个工作副本。
我的代码如下:
svnlook tree /path/to/repo --full-paths | grep "/$" | grep -v "^/$" | xargs -I {} mkdir -p "{}"
由于输出包含单个 /(即文件系统根文件夹),因此我不想处理它,所以使用了 grep -v "^/$"
。
您可以使用此脚本,它将列出svn repos并在目录中创建结构。
用法: perl checkout-structure.pl repos destdir
repos不能是您的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/$_";
}
我的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());
}