3

我正在寻找一种比 .NET 中的 svn cat 从 SVN 检索文件更快的方法。

目前我正在为每个版本运行一个 svn cat 进程,但它非常慢。

然后我尝试了 SvnClient:

    Stream st = Console.OpenStandardOutput();

    SvnWriteArgs wargs = new SvnWriteArgs();

    for (int i = 3140; i < 3155; ++i)
    {
        wargs.Revision = i;

        client.Write(new SvnUriTarget("http://filezilla.svn.sourceforge.net/svnroot/filezilla/FileZilla3/trunk/README"), st, wargs);
    }
    st.Flush();

但是每次迭代都比svn cat还要慢。

SvnClient 中是否有办法“重用”先前打开的与 SVN 服务器的连接,以便可以更快地运行多个 cat 操作?

4

1 回答 1

4

您可以使用 FileVersions 命令来执行此操作。这会获取一个完整的文件,以及使用单个连接中每个修订之间的差异的所有其他文件。这应该会带来很好的性能提升。

public void WriteRevisions(SvnTarget target, SvnRevision from, SvnRevision to)
{
    using(SvnClient client = new SvnClient())
    {
        SvnFileVersionsArgs ea = new SvnFileVersionsArgs 
            {
                Start = from,
                End = to
            };

        client.FileVersions(target, ea,
            delegate(object sender2, SvnFileVersionEventArgs e)
                {
                    Debug.WriteLine(e.Revision);
                    e2.WriteTo(...);
                 });
    }
}

这需要支持此功能的服务器。我不太确定它是什么时候引入的,但是运行 SvnBridge 的 Codeplex 不支持它。如果我没记错的话,在这种情况下委托只被调用一次,在这种情况下,你将不得不恢复到你的第一个解决方案。在正常情况下,在开始和结束之间的每个修订都会调用委托。

请参阅此测试用例中的方法 WalkMe(和其他方法)以查看有关其用法的更多详细信息(用户名 guest,无密码)。

于 2009-05-16T09:31:55.717 回答