如何通过 TFS 2012 API 锁定本地工作区下的文件



我正在尝试通过具有独占锁定LockLevel.CheckOutworkspace.PendEdit签出单个文件。以下函数成功(无错误),但它似乎对 TFS 中的文件没有影响(未签出且无锁定)。

public static void Lock(string filePath)
    {
        var workspace = GetWorkspace(filePath);
        workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.CheckOut);
    }

我怀疑这与我的 TFS 工作区是本地的有关。但是,Visual Studio 2015似乎没有问题,通过[Source Control Explorer]->[Right Click Selected File]->[Advanced]->[Lock]在文件上建立锁定。我正在做什么与VS正在做的事情不同?我错过了什么吗?

你应该使用 RecursionType.Full

而不是 RecursionType.None。

workspace.PendEdit(new[] {filePath}, RecursionType.Full, null, LockLevel.CheckOut);

PendEdit() 方法返回为指定的 filePath 签出/锁定的文件数。RecursionType.Full 将递归到路径的最后一个子级。

更新:请尝试为 API 项目安装此 TFS nuget 包 (https://www.nuget.org/packages/Microsoft.TeamFoundationServer.ExtendedClient/) 并测试此问题是否仍然存在。如果它有效,无论您使用哪个版本的 VS,都不会出现此问题。

经过多次试验和错误,我最终为NonFatalError实现了一个事件处理程序,如下所示:

private static void VersionControlServer_NonFatalError(object sender, ExceptionEventArgs e)
    {
        if (e.Failure != null && e.Failure.Severity == SeverityType.Error)
            throw new ApplicationException("An internal TFS error occurred. See failure message for details:rn"+e.Failure.Message);
    }

一旦事件处理程序通过versionControlServer.NonFatalError += VersionControlServer_NonFatalError;挂接到versionControlServer对象,我就能够看到我的独家签出发生了什么。事实证明,TFS 以静默方式失败,出现以下错误:

TF400022: The item $/Fake/Server/Path/project.config cannot be locked for checkout in workspace MYWORKSPACE;Dan Lastname. Checkout locks are not supported in local workspaces.

解决方案是将LockLevelLockLevel.CheckOut更改为LockLevel.Checkin。它是一种略有不同的锁类型,但它足以满足我的需求,这就是 VS 尝试在本地工作区中锁定文件时使用的锁类型。所以这是我的原始功能,LockLevel的微小变化使一切变得不同。

public static void Lock(string filePath)
{
    var workspace = GetWorkspace(filePath);
    workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
} 

相关内容

最新更新