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

How to lock a file under local workspace via TFS 2012 API

我正在尝试通过 workspace.PendEdit 使用独占锁 LockLevel.CheckOut 签出单个文件。以下函数成功(无错误)但它似乎对 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() 方法 return 为您指定的文件路径检查的文件数 out/locked。 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:\r\n"+e.Failure.Message);
    }

一旦事件处理程序通过 versionControlServer.NonFatalError += VersionControlServer_NonFatalError; 连接到 versionControlServer 对象,我就能够看到我的独占 check-outs 发生了什么。事实证明,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。它的锁类型略有不同,但足以满足我的需要,这就是当您尝试在 local 工作空间中锁定文件时 VS 使用的锁类型。所以这是我的原始函数,LockLevel 中的微小变化使所有的不同。

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