有没有办法执行 SVN 检出(或导出),它只会获取目录结构;也就是说,没有文件?
12 回答
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 命令指定--non-recursive,可能会帮助您获得所需的内容。
subversion 的 contrib 工具中有一个python 脚本,它使用空文件创建目录结构。有了一点 Python 知识,跳过创建文件应该不难。
SVN 本身无法做到这一点,但如果您只想导出目录结构,请尝试svn ls -R --xml
获取目录结构的 XML 列表,然后手动重新创建它。
仅签出目录结构的用途是无法排除一个或多个目录被签出的部分解决方法。假设与检出完整源代码相比,检出目录树的成本可以忽略不计。签出版本化目录结构后,我可以使用 Subversion 的更新和稀疏目录有选择地选择哪些目录树应该包含文件。
这完美地工作
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 "^/$"
输出包含一个 / (即文件系统根文件夹),我不想弄乱它。
我的 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());
}
在 windows 和 TortoiseSVN 上你可以做 Checkout -> checkout depth: only this item。这样您就可以获得单个文件夹/文件。您可以通过这种方式重建您的结构(使用 repobrowser)。有点麻烦,但如果您的目录结构不太复杂,则可行。我更喜欢通过慢速网络检查数千个小文件(几千兆字节)...
你可以使用这个脚本来列出 repos 并在目录中创建结构。
用法: perl checkout-structure.pl repos destdir
repos 不能是你的 repos 的根目录,它也可以是一个目录。
无法创建包含重音字符 (àéîùç...) 的目录,但可以很好地处理空格。对于那些有时间的人,我认为这是一个编码问题。
结帐结构.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属性来防止文件被提交。这对于防止生成的工件(例如文档或缓存文件)被提交特别有用。