使用 SvnClient 实现更快的 svn cat

发布于 2024-07-18 11:54:40 字数 563 浏览 10 评论 0原文

我正在寻找一种比 .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 服务器的连接,以便多猫操作可以运行得更快?

I'm looking for a faster way to retrieve files from SVN than svn cat in .NET.

Currently I'm running a svn cat process for each revision, but it's extremely slow.

Then I've tried with 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();

But each iteration is even slower than svn cat.

Is there a way in SvnClient to "reuse" a previously opened connection to the SVN server so that a multiple cat operation can be run faster?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

从﹋此江山别 2024-07-25 11:54:40

您可以使用 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,无密码)。

You can use the FileVersions command to do this. This fetches one complete file, and all other files using the differences between each revision in a single connection. This should give a nice performance boost.

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(...);
                 });
    }
}

This requires a server that supports this feature. I'm not quite sure when it was introduced, but Codeplex running SvnBridge for instance doesn't support it. If I remember correctly the delegate is called only once in that case, in that case you'll have to revert to you first solution. Under normal circumstance the delegate is called for each revision between Start and End.

See method WalkMe (and others) in this testcase to see more details about its usage (Username guest, no password).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文