如何删除/修复ghost工作区

时间:2016-05-16 02:51:35

标签: azure-devops

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

当我尝试从sidekicks中删除它时,它也会导致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。

3 个答案:

答案 0 :(得分:2)

对于身份问题,巴克肯定是正确的。我在Azure AD迁移后偶然发现了它。幸运的是有一种方法。以下是我在Team Foundation .NET程序集的帮助下找到的PowerShell解决方案。 (对于记录,我使用的是PowerShell 5.0版。)

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

          请注意,您也可以调用针对VCS发布的QueryWorkspaces()返回的Delete()对象上的Workspace方法...

          HTH

答案 1 :(得分:1)

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

我无法确定,但如果您确定可以安全删除任何所有者的所有工作区,则可以运行tf工作区/删除并为所有者使用通配符工作区名称(要非常小心,确保不要删除其他人的工作区)。

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

答案 2 :(得分:1)

您可以使用 tf工作区命令来获取所有工作区的详细XML信息,包括所有者的唯一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