【问题标题】:How can I remove/fix a ghost workspace如何删除/修复幽灵工作区
【发布时间】:2016-05-16 02:51:35
【问题描述】:

不知何故,我最终得到了一个“幽灵”工作区。它不会显示在 Visual Studio 中的“管理工作区”下。当我连接到 VS Team Services 和开源控制资源管理器时,它会弹出一个错误对话框,显示 TF14061(“工作区不存在”)

当我尝试从伙伴中删除它时,它也会导致 TF14061:

tf vc workspace "MYCOMPUTER;My Name" /delete /collection:https://me.visualstudio.com/defaultcollection

TF14061: The workspace MYCOMPUTER;My Name does not exist.

在我的计算机上搜索搁置集时可以看到工作区:

tf workspaces /computer:MYCOMPUTER /owner:* /collection:https://me.visualstudio.com/defaultcollection

结果:

=======================================================================================================================
Workspace  : MYCOMPUTER
Owner      : My Name
Computer   : MYCOMPUTER
Comment    :
Collection : https://me.visualstudio.com/defaultcollection
Permissions: Private
Location   : Server
File Time  : Current

Working folders:
$/: C:\local

仅按工作区名称或所有者名称搜索工作区根本不会返回工作区。

我正在尝试创建一个新工作区并将其映射到同一个文件夹,但我收到此文件夹已映射到另一个工作区的错误。

如何删除这个虚拟工作区?

编辑:附加信息 即使所有者相同,这些重复工作区的安全令牌似乎也不同。一个匹配我的 Azure AD 帐户,另一个匹配我的 Microsoft 帐户。这很奇怪,因为我的 Microsoft 帐户对此服务器没有权限。

注意:我正在使用 Visual Studio Team Services。

【问题讨论】:

  • 您是否尝试使用“tf workspaces /owner:* /computer:MachineName /collection:xxxx.visualstudio.com”命令列出您机器上所有用户创建的工作空间?
  • @Eddie-MSFT 刚刚试了一下,它也显示了工作区。
  • 您是否查看了此链接:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
  • 我确实尝试手动删除缓存并运行 tf workspaces /remove:* 来删除缓存。都没有帮助我。我(还)没有重命名我的电脑。请注意,所有者有我的名字,但当我按所有者姓名搜索时,工作区没有显示。我也可以创建一个名称完全相同的新工作区。我只是(显然)无法映射到“ghost”工作区中使用的同一目录。
  • 如果可以新建一个同名的工作空间,那么工作空间的所有者名称应该不同。

标签: azure-devops


【解决方案1】:

您可以使用 tf workspaces 命令获取所有工作区的详细 XML 信息,包括所有者 uniqe id 和所有者别名用户名:

tf workspaces /owner:* /format:xml

示例输出:

<Workspace computer="computer" name="wrkspacename" ownerdisp="Some Name" 
    ownerid="S-1-5-00-0000000000-0000000000-000000000-0000" 
    ownertype="System.Security.Principal.WindowsIdentity"
    owner="12345678-90ab-cdef-1234-567890abcdef"
    owneruniq="12345678-90ab-cdef-1234-567890abcdef">
  <Comment />
  <Folders>
    <WorkingFolder local="C:\Folder" item="$/Folder" />
  </Folders>
  <LastAccessDate>2019-01-01T01:02:03.456+00:00</LastAccessDate>
  <OwnerAliases>
    <string>SERVER\Name</string>
    <string>Name</string>
    <string>Some Name</string>
  </OwnerAliases>
</Workspace>

然后您可以尝试一些 OwnerAliases 作为所有者来删除工作区或直接使用 owneruniq

tf workspace /delete wrkspacename;12345678-90ab-cdef-1234-567890abcdef

【讨论】:

  • 非常感谢 - xml 输出终于帮助我看到了我需要使用的“Windows Live ID\foo.bar.company@outlook.com”格式。
  • 请注意,在某些情况下,您可能需要显式指定集合(如果使用 Azure DevOps 似乎有必要),例如tf workspace /delete wrkspacename;12345678-90ab-cdef-1234-567890abcdef /collection:https://dev.azure.com/{YourOrg}/}
【解决方案2】:

巴克在身份问题上是绝对正确的。我昨天在 Azure AD 迁移后偶然发现了它。幸运的是,有办法解决。这是我在 Team Foundation .NET 程序集的帮助下找到的 PowerShell 解决方案。 (作为记录,我使用的是 PowerShell 5.0 版。)

  1. 将这些程序集加载到您的 PowerShell 会话中(其中版本与您安装的 Visual Studio 相匹配;在我的情况下,Version=12.0.0.0 对应于 VS 2013):
Add-Type -AssemblyName 'Microsoft.TeamFoundation.Client,版本=12.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'
Add-Type -AssemblyName 'Microsoft.TeamFoundation.VersionControl.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
  1. 连接到 VSTS 版本控制服务器:
$uri = 'https://me.visualstudio.com/defaultcollection'
$tfs = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($uri)
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
  1. 查询要删除的工作区并检索其限定名称:
$vcs.QueryWorkspaces('WorkspaceName', $null, $null) | % QualifiedName

您可以查看QueryWorkspaces online help。如果对QueryWorkspaces() 的调用没有返回任何内容(如果您只传递一个计算机名称就是这种情况),您可能不得不以这种方式发出它:

Invoke-Method -InputObject $vcs -MethodName 'QueryWorkspaces' -Arguments $null, $null, 'ComputerName' | % QualifiedName

这似乎是因为$null 不能直接从 PowerShell 中传递。我之前遇到过这个问题,这个post 帮助了我(但它现在似乎已经退休了)。

  1. 将限定名称传递给TF.exe 以删除工作区(记住它是PowerShell,因此是--%):
tf 工作区 /collection:$uri --% /delete 'WorkspaceName;11111111-2222-3333-4444-555555555555'

请注意,您不妨在针对 VCS 发出的 QueryWorkspaces() 返回的 Workspace 对象上调用 Delete() 方法...

HTH

【讨论】:

  • François,我可以在 PS 会话中加载 VS 2017 的程序集吗?就像你在上面展示的那样?如果是,您知道 VS 2017 对应的版本是什么,公钥令牌会保持不变吗?
  • 嗨,SRP,它也应该适用于 VS 2017,但是在 VS 2017 中,情况发生了一些变化。老实说,我没有用 VS 2017 测试它,而是用 VS 2019 测试它。您需要安装 PowerShell 模块 'VSSetup' ,可在 PowerShell Gallery 上找到。然后您可以执行以下几行 PowerShell 来加载程序集:请参阅我的下一条评论和 What's the equivalent of vswhere -find in vssetup.powershell 以获得灵感。
  • 获取 VSSetupInstance | Select-VSSetupInstance - 需要 Microsoft.VisualStudio.TeamExplorer -Latest | Get-ChildItem -Recurse -Filter TeamFoundation -Directory |转换路径 |加入路径-ChildPath * | Get-ChildItem -Recurse -包括 Microsoft.TeamFoundation.Client.dll、Microsoft.TeamFoundation.VersionControl.Client.dll |转换路径 | ForEach-Object -Process { Add-Type -LiteralPath $_ }
【解决方案3】:

这里发生的情况是您有两个具有相同显示名称的身份。其中一个身份是使用您的 Microsoft 帐户 (MSA) 创建的旧身份。新标识是您的 Azure AD 帐户 (AAD)。在内部,它们具有不同的 GUID。当您使用显示的所有者名称运行 tf 命令工作区 /delete 命令时,不明确的显示名称将解析为当前身份 (AAD),而不是实际拥有该工作区的旧身份 (MSA)。

我不记得了,但是如果您确定可以安全地删除具有该工作区名称的任何所有者的所有工作区,您可以运行 tf workspace /delete 并为所有者使用通配符(要非常小心以确保您不会删除其他人的工作区)。

我建议尝试Attrice Sidekick for TFS 并使用那里的管理工作区功能来查看是否可以删除旧身份下的工作区。如果可行,那将是最安全、最简单的路线。

【讨论】:

  • 您的评估基本正确。一年多前,我们确实从 MSA 迁移到了 AAD。 MSA 的所有权限都被撤销了。僵尸工作区的所有者 ID 匹配匹配 AAD。不知何故,安全令牌包含 MSA id。这些工作区也不能使用 TF Sidekicks 删除。
  • 如果您要在 visualstudio.com/en-us/support/… 打开免费支持案例,我们将与您一起解决这个问题。
  • 我们几天前开了一张支持票,似乎正在处理中。
  • @Onots 我也有同样的问题...你找到解决办法了吗?
  • @mehrandvd 在 10 月 20 日的 VSTS 中有一个回归,该回归在 10 月 23 日(大多数情况下)已修复。见blogs.msdn.microsoft.com/vsoservice/?p=12605
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多