我正在尝试通过具有独占锁定LockLevel.CheckOut
的workspace.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.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.
解决方案是将LockLevel
从LockLevel.CheckOut
更改为LockLevel.Checkin
。它是一种略有不同的锁类型,但它足以满足我的需求,这就是 VS 尝试在本地工作区中锁定文件时使用的锁类型。所以这是我的原始功能,LockLevel
的微小变化使一切变得不同。
public static void Lock(string filePath)
{
var workspace = GetWorkspace(filePath);
workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
}