【问题标题】:TFS 2015 The item is locked in workspace (null);(null)TFS 2015 项目被锁定在工作区(null);(null)
【发布时间】:2016-03-27 06:35:56
【问题描述】:

我们最近从 TFS 2010 升级到 TFS 2015。升级后一切似乎都很好,但我们收到错误消息“项目已锁定在工作区 (null);(null)”。在一些源代码控制文件上。看起来我们有一些孤立的锁需要被追踪和清理,但是 tbl_lock 数据库表不在数据库中,所以下面的 select 查询将不起作用:

select * FROM tbl_Lock l 
LEFT JOIN tbl_PendingChange pc 
ON l.PendingChangeId = pc.PendingChangeId 
WHERE pc.PendingChangeId IS NULL

有谁知道如何在 TFS 2015 中检测和删除这些锁?

我还安装了 TFS 电动工具,Visual Studio 2015 和电动工具都没有开锁。

更新:

顺便说一句,当我运行 SELECT 查询以找出 PendingChangeId 为 NULL 的位置时,我没有返回任何行。我认为诀窍是左连接。当 tbl_Lock 也没有 tbl_PendingChange 上的 PendingChangeId 记录时,PendingChangeId 将为 NULL(因此锁是孤立的)。所以我仍然需要知道 PendingChangeId 通常应该在 TFS 2015 中加入到哪里,以确定哪些文件的锁是坏的。 (或者工作区不再存在,这可能是问题的另一个可能来源。)

而且我还需要知道如何清理那些坏锁。我更喜欢通过 GUI 或命令行使用工具来执行此操作,但也可以使用 API 或 TFS 2015 的 TFS 对象模型文件以编程方式执行此操作。

我真的宁愿只作为最后的手段直接接触数据库。而且我也宁愿在项目上使用 tf vc destroy 作为最后的手段,因为这会清除文件上的所有历史记录。

更新 2

啊哈!我想我找到了一种识别文件的方法,看起来我对发生的事情的想法可能是正确的。不幸的是,我不得不使用 READ UNCOMMITTED 查询来探测数据库以查找信息。我无法以编程方式或使用工具获取此信息。 (他们都显示或表现得好像文件没有被签出。)我在 TFS 2015 上使用的查询是:

select pc.* from tbl_PendingChange pc 
left join tbl_Workspace ws on pc.WorkspaceId = ws.WorkspaceId 
where ws.WorkspaceId is null

这返回了在我们的数据库上具有 (null);(null) 锁定的三个文件,因为 tbl_PendingChange 上列出的 WorkspaceId 在 tbl_Workspace 上不再存在。

这是怎么发生的?我们的 CI 服务器使用临时 TFS 工作区。我认为升级后发生的事情是我们的 CI 服务器去检查文件并对其应用更新。 (例如,在构建过程中增加版本号。)它检出文件,但未能应用更新。 (我们的工具喜欢使用服务器工作区,但它可能以本地工作区结束,因此该文件仍然在本地签入,但在服务器上签出。因此无法应用对文件的更改。)我们正在使用的代码执行一个工作区。当过程完成时删除操作,所以工作区被删除了——即使工作区仍然有文件被签出!因此,这在 tbl_PendingChange 上创建了一条孤立记录,该记录未链接到任何工作区,因此该文件仍被挂起的更改锁定。但是 GUI 和工具并没有这样看待它,因为他们没有意识到待定更改的工作区不存在。

所以这让我回到了如何解决这个问题?如果有人知道如何处理这些孤立的未决更改,我将不胜感激。我尝试使用:

        TfsTeamProjectCollection tfsTeamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(szProjectUri));
        VersionControlServer versionControlServer = tfsTeamProjectCollection.GetService<VersionControlServer>();

        string[] items = new[] { ... server item path ... };
        PendingSet[] queryPendingSets = versionControlServer.QueryPendingSets(items, RecursionType.None, null, null);
        PendingSet[] getPendingSets = versionControlServer.GetPendingSets(items, RecursionType.None);

但这些都没有找到孤儿。

更新 3

我终于安装了 Team Foundation Sidekicks 2015 并试了一下 - 特别是状态工具,然后是其他工具。它正在查找待处理的更改,但不是孤立的。

【问题讨论】:

    标签: tfs-2015


    【解决方案1】:

    您可以使用Team Foundation Sidekicks搜索和解除锁定,步骤如下:

    1. 安装该工具并启动它。
    2. 选择要连接的 TFS 服务器。
    3. 选择“工具\状态助手”。
    4. 为您想要的信息设置“搜索条件”。
    5. 点击“搜索”按钮。
    6. 选择被锁定的文件并点击“解除锁定”按钮。

    【讨论】:

    【解决方案2】:

    您可以使用以下命令撤消待处理的更改:

    tf undo "file_path" /workspace:workspace_name
    

    或者您可以使用以下命令删除旧工作区

    tf workspace /delete /server:your_tfs_server workspace;username
    

    来自 Visual Studio 2015 GUI:

    File -> Source Control -> Advanced -> Workspaces...
    

    在出现的对话框中,选中“显示远程工作区”,锁定的工作区出现在窗口中。然后选择它并点击“删除”。


    有关它的详细信息,请查看此blog 更多解决此问题的方法您可以参考类似问题:What do you do if the file in TFS is locked by someone else?


    更新:

    根据sql查询。它正在寻找 .PendingChangeId IS NULL 。您可以在集合数据库下使用类似的 tbl_PendingChange。但是,这不是一种褒奖的方法。由于不建议直接在 TFS 数据库中操作。

    【讨论】:

    • 但是如何表示 (null);(null) 工作区?即使我以项目集合管理员身份登录,我也无法将其视为远程工作区。
    • 我还尝试将 (null) 和 * 放入 GUI,但它告诉我找不到 ID 或我需要所有者。
    • 我也试过了;和 (null);(null) 和 ; 在命令中,这些都不适用于 tf vc undo。当我列出带有 tf 工作区的工作区时,我也没有看到 (null);(null) 工作区。
    • 最后一个;应该是星号分号星号。
    • 你从这个博客blogs.msdn.microsoft.com/chandrur/2010/09/21/…找到解决方案了吗?对于 TFS2015,没有表 tbl_lock。当然,选择查询是行不通的。
    【解决方案3】:

    以下命令已清除孤立的待处理变更集:

    tf vc destroy <itemspec> /startcleanup
    

    运行此命令后,文件可以重新添加到 TFS,并且可以正常检入和检出文件并进行编辑。运行查询:

    select pc.* from tbl_PendingChange pc 
    left join tbl_Workspace ws on pc.WorkspaceId = ws.WorkspaceId 
    where ws.WorkspaceId is null
    

    还表明与此文件相关的待处理变更集记录也已消失。

    可以在https://msdn.microsoft.com/en-us/library/bb386005.aspx 找到有关此命令的 Microsoft 文档。在使用此命令之前,您应该仔细阅读文档,并确保了解使用它的后果。

    因为此命令会从 TFS 中永久删除文件并可能删除所有历史记录 - 并且以递归方式执行 - 您需要采取预防措施并绝对确定您正确地定位了该命令。所以在使用这个命令之前,我建议采取以下额外的预防措施:

    1. 停止所有用户和外部对 TFS 和任何其他可能在计算机上运行的软件的访问。
    2. 确保运行 TFS 和计算机上的任何其他数据库的完整备份。
    3. 如果可以,请及时拍摄服务器快照。

    这样,如果出现严重错误,您将有一个或多个点可以依靠。

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多