首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharpSVN SvnClient.Add()中是否存在目录错误?

SharpSVN SvnClient.Add()中是否存在目录错误?
EN

Stack Overflow用户
提问于 2012-07-26 06:54:07
回答 3查看 2K关注 0票数 1

我正在尝试使用SharpSVN自动化Subversion签入,但我在使用SvnClient.Add()方法时遇到了问题,我认为这可能是一个错误。从本质上讲,.Add()不会将路径视为工作副本,然而,SvnClient.GetUriFromWorkingCopy()会很好地看到它。看起来.Add()查找的目录比它应该查找的目录高了1个目录,并且我似乎不能通过使用来欺骗.Add()。或者..。

我的代码证明如下。通过将路径指向工作副本的顶层进行复制,然后运行。感谢任何人的帮助!

代码语言:javascript
复制
    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();

    }

以及由此产生的输出:

代码语言:javascript
复制
C:\temp\sqlcompare
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy

添加尾随斜杠也不起作用:

代码语言:javascript
复制
C:\temp\sqlcompare\
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy
EN

回答 3

Stack Overflow用户

发布于 2012-08-22 00:40:56

在本地路径成为工作副本之前,您需要一个.Checkout()调用(或与另一个客户端的某种签出)。您只能将目录添加到现有工作副本。

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-24 22:01:42

文档在这一点上并不清楚,但是如果您看一下SharpSvn.SvnDepth枚举,您可以做出一些有根据的猜测。目前还没有办法调用SvnClient.Add(targetPath)并让它尝试添加targetPath (targetPath/*)的所有子对象。对于此应该有一个SvnDepth。

另一个让我恼火的地方是,Add似乎没有应用工作副本的忽略列表。

因此,为了做你想做的事情,我建议这样做:

代码语言:javascript
复制
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);
    }
}

它仍然需要错误处理和通用代码改进(例如,围绕忽略列表),但它应该让人明白这一点。

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 02:35:43

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

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11659867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档