【问题标题】:TFS C# API: Workspace.PendAdd silently failsTFS C# API:Workspace.PendAdd 静默失败
【发布时间】:2012-09-14 02:07:50
【问题描述】:

Microsoft.TeamFoundation.VersionControl.Client.Workspace.PendAdd

由于某种原因,每当我从 TFS API 调用 PendAdd 方法时,它都会毫无例外地执行,但未能将任何文件标记为已添加到我的工作区中。但是,调用 PendEdit 始终按预期工作。我已验证所使用的帐户具有在 TFS 中添加的权限,并且具有对相关文件的完全控制 Windows 权限。

有什么想法吗?

我的代码(为了调试,我尝试了 PendAdd 方法的四种输入变体):

public bool AddFile( string filePath, out string status, bool isRecursive = false )
{
    Workspace workspace = GetWorkspace( out status );
    if( workspace == null )
    {
        return false;
    }

    workspace.PendAdd( filePath, isRecursive );

    status = "Success";
    return true;
}

public bool CheckOutFile( string filePath, out string status )
{
    Workspace workspace = GetWorkspace( out status );
    if( workspace == null )
    {
        return false;
    }

    workspace.PendEdit( filePath );

    status = "Success";
    return true;
}
...
string status;

// $/Solution/.../foo.cs (non-recursive)
if( TFS.AddFile("$/Solution" + Regex.Split(target, "Solution")[1].Replace('\\', '/'), out status) == false )
{
    throw new Exception( "TFS Add failed: " + status );
}

// $/Solution/.../ (recursive)
if( TFS.AddFile("$/Solution" + Regex.Split(target.Substring(0, target.LastIndexOf('\\')), "Solution")[1].Replace('\\', '/'), out status, true) == false )
{
    throw new Exception( "TFS Add failed: " + status );
}

// Calls PendEdit with C:\TFS\Solution\...\foo.cs; this works
if( TFS.CheckOutFile(target, out status) == false )
{
    throw new Exception( "TFS Checkout failed: " + status );
}

// C:\TFS\Solution\...\foo.cs (non-recursive)
if( TFS.AddFile(target, out status) == false )
{
    throw new Exception( "TFS Add failed: " + status );
}

// C:\TFS\Solution\...\ (recursive)
if( TFS.AddFile(target.Substring(0, target.LastIndexOf('\\')), out status, true) == false )
{
    throw new Exception( "TFS Add failed: " + status );
}
...
private Workspace GetWorkspace( out string status )
{
    Workspace[] workspaces = _versionControlServer.QueryWorkspaces( null, _versionControlServer.AuthorizedUser, Environment.MachineName );

    if( workspaces.Length != 1 )
    {
        status  = "You must have exactly 1 local workspace to promote code.";
        return null;
    }
    else
    {
        status  = "You have exactly 1 local workspace.";
    }

    return workspaces[0];
}

【问题讨论】:

  • GetWorkspace 的代码是什么?您的工作区映射是什么样的?
  • 刚刚添加。我有一个工作区,其中有两个项目已签出,并且只有一个项目正在被代码主动修改。工作区永远不会在此代码之外修改。
  • *一个工作区映射了两个项目(两个项目在同一个解决方案中)。需要澄清的是,工作区/映射是使用 Visual Studio 设置的,并且已被 Visual Studio 用于签入代码,但除此代码之外的任何东西都不会持续使用。

标签: c# .net windows tfs windows-server-2008


【解决方案1】:

嗯,这很奇怪,但我做了一个更改,允许多个用户通过这个控制器(而不是一个硬编码的用户)添加或编辑文件,并在必要时为每个用户创建一个新的工作区,现在一切都像原来一样工作故意的。考虑到本应与此行为相关的任何内容都没有以任何重大方式进行修改,这很奇怪。

我不完全相信这不是一个错误/我以前没有在代码中遇到过一些边缘情况,但只要我的项目有效(它现在可以)我无论哪种方式都不太关心。

Relevant Microsoft Connect thread(以防这确实是 TFS 的问题并在稍后解决)。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题(即使使用 MSDN 示例 here),但在调用 PendAdd 之前调用 Workstation.EnsureUpdateWorkspaceInfoCache 为我解决了这个问题。

    收听NonFatalErrors 可以为您提供有关此类问题的非常有用的提示。

    【讨论】:

    • 这对我有用。谢谢!我花了 3 天的时间在里面醒来。
    【解决方案3】:

    我已经重现了这种奇怪的行为。我可以通过在我的文件系统上创建文件BEFORE 将其添加到sourceControl 来修复它。

    否则会静默失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      相关资源
      最近更新 更多