我正在尝试通过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的做法有什么不同?我错过了什么吗?
答案 0 :(得分:0)
您应该使用RecursionType.Full而不是RecursionType.None。
{{1}}
PendEdit()方法返回为您指定的filePath签出/锁定的文件数。 RecursionType.Full将递归到路径的最后一个子节点。
更新: 请尝试为您的API项目安装此TFS nuget包(),并测试此问题是否仍然存在。如果它有效,无论您使用何种版本的VS,都不会出现此问题。
答案 1 :(得分:0)
经过多次试验和错误后,我最终实现了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
连接到versionControlServer.NonFatalError += VersionControlServer_NonFatalError;
对象,我就可以看到我的独家结账时发生了什么。事实证明,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);
}