【问题标题】:How can I find the lock owner with SharpSVN?如何使用 SharpSVN 找到锁拥有者?
【发布时间】:2015-11-13 21:46:05
【问题描述】:

我们在 Windows 2012 上运行 VisualSVN。我的任务是防止锁被盗。我想使用预解锁挂钩。首先,我想将锁拥有者的姓名与开锁用户的姓名进行比较。我可以通过svnlook在服务器上找到锁拥有者:

svnlook lock C:\Repositories\DIT_TEST time-for-a-sandwich.txt

这给了我一个包含所有者的信息的小列表。凉爽的。

我想在 SharpSVN 中复制它。到目前为止,这是我所拥有的:

using (SvnClient client = new SvnClient())
{
    StringBuilder sbLockOwner = new StringBuilder();
    Collection<SvnListEventArgs> col;
    if (client.GetList(new Uri("https://dit-visualsvn/svn/DIT_TEST"), out col))
    {
        foreach (SvnListEventArgs svnListEventArg in col)
        {
            sbLockOwner.Append(svnListEventArg.Lock.Owner.ToString());
        }
    }
}

当我尝试释放锁时,我得到了错误:

Unable to connect to a repository at URL 'https://dit-visualsvn/svn/DIT_TEST' --->
Access to '/svn/DIT_TEST' forbidden.

我已验证我的用户对存储库具有读/写权限,并且我已尝试使用 client.Authentication.ForceCredentials("login", "pswd"); 解决方案。仍然不允许。

如何使用 SharpSVN 获取锁拥有者的姓名?

更多信息:如果我将代码更改为this SO 上的响应,我仍然看到访问被禁止。

【问题讨论】:

    标签: svn tortoisesvn sharpsvn


    【解决方案1】:

    如果你想使用 SharpSvn 复制“svnlook”,你应该从查看SvnLookClient开始。

    我猜您正在将 Windows/集成安全性与您的 visualsvn 服务器一起使用,并且(通常)不会在不同凭据下运行的服务器进程中工作。但是,当您在存储库挂钩中时,您不需要凭据,因为您可以访问物理文件。

    但是你遇到了svnlook lock 尚未在SvnLookClient 上实现的问题...

    那时我通常会开始查看svnadmin 命令,看看是否有与svnlooksvnadmin 在同一层上工作的等效命令。在这种情况下,您会找到 svnadmin lslockssvnadmin locksvnadmin unlock... 但是继续在 SharpSvn 的类似 svnadmin 的 SvnRepositoryClient 上搜索,您也找不到这些命令。


    那时我切换到不同的回答模式。该功能还没有在 SharpSvn 中。但截至目前,它在最后一个 SharpSvn 版本中可用。


    你现在应该可以使用了

    void Main(string[] args)
    {
       SvnHookArguments ha;
       if (!SvnHookArguments.ParseHookArguments(args, SvnHookType.PreUnlock, Console.In, out ha)
       {
           Console.Error.Writeline("Bad arguments");
           Environment.Exit(1);
       }
       using (SvnLookClient look = new SvnLookClient())
       {
           SvnLockInfo lck;
           look.GetLock(ha.LookOrigin, ha.Path, out lck);
    
           if (lck == null)
               return; // Wasn't locked???
    
           // lck.Owner now contains the old owner
           // ha.User the new user
       }
    }
    

    但我猜你也想实现一个 .PreLock 钩子,因为我通常在自己获得锁时打破锁......而不是通过解锁。

    【讨论】:

    • 这看起来很有希望。我今天会尝试新版本。是的,也许我确实需要做一个预锁钩。基本上,我们有团队成员希望我禁用窃取锁。
    • 我一直在尝试使用它,但我不断收到the located assembly's manifest defintion does not match the assembly reference. 的错误,我已将其删除并重新添加到不同的项目中,我似乎总是想出这个。我可能仍然做错了什么,但我很好奇您是否知道任何此类问题。
    • 如果没有实际的错误消息,很难猜测是什么原因造成的。看起来像是程序集不匹配,但如果没有安装正确的 Visual C++ 运行时,很容易导致此类问题。根据 SharpSvn 构建,这可能是 VS2008 或 VS2010、x86 或 x64 版本。如果使用 .Net 2.0+ 程序集,则需要 VS2008 版本,如果使用 .Net 4.0+ 程序集,则需要 VS2010 版本。如果您在 .Net 4.0+ 设置中使用 2.0+ 版本,则需要在应用程序配置文件中使用特定配置选项(如错误消息所述)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多