31

在我的一台机器上,我从任何GetLocalWorkspaceInfo调用中得到 null 的返回值。我已经将问题隔离到这个简单程序甚至失败的地方:

namespace WorkstationTest
{
    using Microsoft.TeamFoundation.VersionControl.Client;

    class Program
    {
        static void Main()
        {
            string workspaceLocalPath = @"C:\Dev";
            var info = Workstation.Current
                          .GetLocalWorkspaceInfo(workspaceLocalPath);

            // info is always null here
        }
    }
}

我已经检查过的内容:

  • 完全相同的代码以应有的方式在我的另一台机器上运行。

  • 我已经确认我有一个工作区C:\Dev

    工作区截图

  • 我在不同的目录中创建了一个新的工作区,并更改了workspaceLocalPath代码中的变量以匹配。

  • 我查阅了说明返回值将为 null的文档if the path is not in a workspace。从上图中,路径应该在工作区中。

然而,一切似乎都表明这应该可行。有什么我可能会丢失的吗?

4

8 回答 8

23

在我工作的公司从 TFS2013 迁移到 TFS2017 后,Workstation.Current.GetLocalWorkspaceInfo 遇到了同样的问题。

对我有用的是调用Workstation.EnsureUpdateWorkspaceInfoCache

TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("<your-tfs-uri-here>"));
VersionControlServer tfServer = tpc.GetService<VersionControlServer>();
Workstation.Current.EnsureUpdateWorkspaceInfoCache(tfServer, tfServer.AuthorizedUser);

我将上述代码行添加到使用 GetLocalWorkspaceInfo 的 TFS 代理类的构造函数中。

于 2017-04-11T14:23:30.957 回答
15

tf workspaces在 Visual Studio 2010 命令提示符中执行(在我的计算机上)时,它会显示No workspace matching * found on this computer,但在 Visual Studio 2012 中执行相同的命令时,它会返回我所有预期的工作区。

可以通过执行以下任一操作来解决此问题:

  • 引用Microsoft.TeamFoundation.VersionControl.Client与 Visual Studio 2012 连接的 dll 版本,而不是与 Visual Studio 2010 连接的 dll。

  • 打开 Visual Studio 2010 并将其连接到 TFS,它将为 Visual Studio 2010 创建工作区

于 2013-04-11T22:00:03.370 回答
9

我知道这是一篇旧帖子,但只是想分享我们拥有的解决方法,通过使用 VersionControlServer.QueryWorkspaces 在他/她的机器上为用户查询所有工作区。

private static Workspace FindWorkspaceByPath(TfsTeamProjectCollection tfs, string workspacePath)
{ 
    VersionControlServer versionControl = tfs.GetService<VersionControlServer>();

    WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(workspacePath);

    if (workspaceInfo != null)
    {
        return versionControl.GetWorkspace(workspaceInfo);
    }

    // No Workspace found using method 1, try to query all workspaces the user has on this machine.
    Workspace[] workspaces = versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName);
    foreach (Workspace w in workspaces)
    {
        foreach (WorkingFolder f in w.Folders)
        {
            if (f.LocalItem.Equals(workspacePath))
            {
                return w;
            }
        }
    }

    throw new Exception(String.Format("TFS Workspace cannot be determined for {0}.", workspacePath));
}
于 2016-04-21T03:22:28.223 回答
8

就我而言,发生此问题的原因是VersionControl.config放置在 TFS 缓存文件夹 ( C:\Users\DeepakR\AppData\Local\Microsoft\Team Foundation\5.0\Cache\Volatile\0cb76a25-2556-4bd6-adaa-5e755ac07355_http) 下的文件经过折腾,即配置的工作区信息无法按预期使用。

所以,它基本上需要刷新VersionControl.config文件。再次加载 Visual Studio 时会发生自动刷新,即它从服务器中提取配置的工作区信息并更新配置文件,或者即使我们执行 tf 命令实用程序 ( tf.exe workspaces /collection:TFSURL)

Microsoft.TeamFoundation.VersionControl.Client的 (v12.0.0.0)Workstation类有一个函数EnsureUpdateWorkspaceInfoCache可以做同样的事情

VersionControlServer vcs = (VersionControlServer)tpc.GetService(typeof(VersionControlServer));
Workstation.Current.EnsureUpdateWorkspaceInfoCache(vcs, Environment.UserName);

https://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.workstation.ensureupdateworkspaceinfocache(v=vs.120).aspx

希望建议有助于解决问题。

于 2016-06-11T19:50:33.043 回答
1

我最近(今天)在使用 Visual Studio 2017 以及安装的其他几个版本和一些本地工作区时遇到了这个问题。

我最终15.x通过“管理 NuGet 包”菜单将“Team Foundation Server Client”NuGet 包更新到最新版本 () 并修复了它。

我也确实首先删除了现有的项目引用,但这部分可能取决于您的需要。

于 2017-04-08T03:41:35.953 回答
1

在我的C:\Users\<username>\AppData\Local\Microsoft\Team Foundation文件夹中,我有 2 个文件夹:

  • 7.0

  • 8.0

在 8.0 文件夹中有以下文件夹:

\Cache\Volatile\c1dbda02-c575-4dd2-b221-e83f7cb63665_http

但在 7.0 文件夹中,该\Cache\Volatile文件夹为空

所以我所做的只是将c1dbda02-c575-4dd2-b221-e83f7cb63665_http文件夹复制到7.0\Cache\Volatile\

GetLocalWorkspaceInfo调用成功返回工作区信息后

于 2019-08-08T12:16:36.597 回答
1

简单地运行技巧

如果没有正确的 DLL 引用,任何事情都无法正常工作。下面解决了我 5 天以来遇到的同样问题,因为它搞砸了我的时间。

将以下 DLL 放在项目的 bin 文件夹中,并为所有 DLL 提供整个解决方案的参考。如果出现任何错误,例如“无法给出参考”,请忽略它并跳过该 DLL 提供参考,而只需将创建 DLL 的错误放入项目将在构建期间自动执行的 bin 文件夹中

DLL 的:

Microsoft.TeamFoundation.Client.dll                                  
Microsoft.TeamFoundation.Common.dll                                   
Microsoft.TeamFoundation.Core.WebApi.dll                              
Microsoft.TeamFoundation.TestManagement.Client.dll                    
Microsoft.TeamFoundation.TestManagement.Common.dll                    
Microsoft.TeamFoundation.Work.WebApi.dll                              
Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll  
Microsoft.TeamFoundation.WorkItemTracking.Client.dll                  
Microsoft.TeamFoundation.WorkItemTracking.Common.dll                  
Microsoft.TeamFoundation.WorkItemTracking.Controls.dll                
Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll                   
Microsoft.TeamFoundation.WorkItemTracking.WebApi.dll                  
Microsoft.VisualStudio.Services.Client.Interactive.dll                
Microsoft.VisualStudio.Services.Common.dll                            
Microsoft.VisualStudio.Services.WebApi.dll                            
Microsoft.WITDataStore32.dll                                          
Microsoft.WITDataStore64.dll                                          

如果系统安装了 MTM 或 TFS,则可以在以下路径中找到上述 dll

路径: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer

于 2018-03-08T12:38:57.003 回答
0

这是当您拥有服务器路径时如何查找工作区的方法:

  Workspace[] workspaces = _versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName);
  return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.TryGetLocalItemForServerItem(ConstDefaultFlowsTfsPath)));

ConstDefaultFlowsTfsPath服务器路径在哪里"$",例如:"$/MyCompany/Services/DiagnosticsFlows"

您还可以将最后一行替换为:

return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.GetServerItemForLocalItem(myLocalPath)));

这也应该对你有用。

于 2016-07-20T12:09:44.707 回答