有没有办法执行SVN结帐(或导出),只能获取目录结构;也就是说,没有文件?
答案 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来阻止首先进行评估的文件。这对于防止生成的文件(如文档或缓存文件)进行评估特别有用。