1

SharpSVN を使用して Subversion のチェックインを自動化しようとしていますが、SvnClient.Add() メソッドに問題があり、バグである可能性があると思います。基本的に、.Add() はパスを作業コピーとして認識していませんが、SvnClient.GetUriFromWorkingCopy() は問題なく認識しています。.Add() は必要以上に 1 つのディレクトリを探しているようで、.Add() を使用してトリックを行うことはできません。また ..

私のコード証明は以下です。作業コピーの最上位へのパスを指定して複製し、実行します。どんな助けでも大歓迎です!

    static void Main(string[] args)
    {
        string PathToTest = @"C:\temp\sqlcompare";

        SvnClient client = new SvnClient();

        SvnAddArgs saa = new SvnAddArgs();
        saa.Force = true;
        saa.Depth = SvnDepth.Infinity;

        Console.WriteLine(PathToTest);
        Console.WriteLine(client.GetUriFromWorkingCopy(PathToTest));

        try
        {
            client.Add(PathToTest, saa);
            Console.WriteLine(@"Success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadKey();

    }

そして、これが生成する出力:

C:\temp\sqlcompare
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy

末尾にスラッシュを追加しても機能しません:

C:\temp\sqlcompare\
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy
4

3 に答える 3

1

ローカル パスが作業コピーになる前に、.Checkout() 呼び出し (または別のクライアントでのチェックアウト) が必要です。ディレクトリを既存の作業コピーにのみ追加できます。

SharpSvn でのこのルールの唯一の小さな例外は SvnClient.Import() です。これは、実際には「svn import」(SvnClient.RemoteImport) の後に「svn checkout --force」が続きます。

于 2012-08-21T16:40:55.897 に答える
0

SharpSvn.SvnDepthこの点に関するドキュメントは不明確ですが、列挙を調べれば、知識に基づいた推測を行うことができます。現在SvnClient.Add(targetPath)、targetPath ( targetPath/*) のすべての子を呼び出して追加しようとする方法はありません。これには SvnDepth が必要です。

私のもう 1 つの不満は、Add が作業コピーの無視リストを適用していないように見えることです。

したがって、やりたいことを実行するには、次のようなことをお勧めします。

private void RecursiveAdd(SvnClient client, string targetPath, List<string> ignoreList)
{
    foreach (var fileEntry in Directory.EnumerateFileSystemEntries(targetPath))
    {
        if (ignoreList.Any(fileEntry.Contains))
            continue;

        Runtime.ActiveLog.Info(fileEntry);
        client.Add(fileEntry, new SvnAddArgs()
                                    {
                                        Depth = SvnDepth.Empty,
                                        Force = true
                                    });

        if (Directory.Exists(fileEntry))
            RecursiveAdd(client, fileEntry, ignoreList);
    }
}

public AddPath(string targetPath)
{
    using (var client = new SvnClient())
    {
        var ignoreList = GetIgnore(targetPath);
        RecursiveAdd(client, targetPath, ignoreList);
    }
}

エラー処理と一般的なコードの改善 (たとえば、無視リストの周り) はまだ必要ですが、要点は理解できるはずです。

于 2012-09-24T14:01:42.017 に答える