1

我正在尝试使用 SharpSVN 自动化 Subversion 签入,但我遇到了 SvnClient.Add() 方法的问题,我相信这可能是一个错误。本质上, .Add() 没有将路径视为工作副本,但是 SvnClient.GetUriFromWorkingCopy() 认为它很好。似乎 .Add() 看起来比它应该高 1 个目录,我似乎无法通过使用 .Add() 来欺骗 .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。

我的另一个烦恼是 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 回答
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);
于 2014-12-02T18:35:42.867 回答