SharpSVN SvnClient.Add()中是否有目录错误?

时间:2012-07-25 22:54:07

标签: c# .net svn sharpsvn

我正在尝试使用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

3 个答案:

答案 0 :(得分:1)

在本地路径成为工作副本之前,您需要.Checkout()调用(或与其他客户端进行一些结帐)。您只能将目录添加到现有工作副本。

SharpSvn中此规则的唯一一个小例外是SvnClient.Import(),它实际上是'svn import'(SvnClient.RemoteImport),后跟'svn checkout --force'。

答案 1 :(得分:0)

关于这一点,文档还不清楚,但是如果你看一下SharpSvn.SvnDepth枚举,你可以做一些有根据的猜测。目前无法调用SvnClient.Add(targetPath)并尝试添加targetPath的所有子项(targetPath/*)。 应该有一个SvnDepth。

我的另一个小小的烦恼是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);
    }
}

它仍然需要错误处理和一般代码改进(例如在忽略列表周围),但它应该得到重点。

答案 2 :(得分:0)

这对我有用。它应该将本地签出的文件夹与SVN中的文件夹同步:

string _localCheckoutPath = @"C:\temp\sqlcompare";
SvnClient client = new SvnClient();

Collection<SvnStatusEventArgs> changedFiles = new Collection<SvnStatusEventArgs>();
client.GetStatus(_localCheckoutPath, out changedFiles);

//delete files from subversion that are not in filesystem
//add files to suversion , that are new in filesystem

foreach (SvnStatusEventArgs changedFile in changedFiles)
{
    if (changedFile.LocalContentStatus == SvnStatus.Missing)
    {
        client.Delete(changedFile.Path);
    }
    if (changedFile.LocalContentStatus == SvnStatus.NotVersioned)
    {
        client.Add(changedFile.Path);
    }
}

SvnCommitArgs ca = new SvnCommitArgs();
ca.LogMessage = "Some message...";

client.Commit(_localCheckoutPath, ca);