TFS 2015项目在工作区中被锁定(null);(null)

时间:2016-02-29 07:23:42

标签: tfs2015

我们最近从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和电动工具都没有安装锁。

更新

BTW,当我运行SELECT查询以找出PendingChangeId为NULL的位置时,我没有返回任何行。我认为诀窍是LEFT JOIN。当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_Workspace上不再存在tbl_PendingChange上列出的WorkspaceId。

这是怎么发生的?我们的CI服务器使用临时TFS工作区。我想升级后发生的事情是我们的CI服务器去检查文件并对其应用更新。 (例如,在构建过程中增加版本号。)它检出了文件,但未能应用更新。 (我们的工具就像使用Server工作区一样,但它可能最终使用Local工作区,因此文件仍在Local中检查,但在Server上检出。因此无法应用对文件的更改。)我们正在使用的代码执行一个workspace.Delete操作在进程完成时,所以工作区被删除 - 即使工作区仍然检出文件!因此,这在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,并专门为它提供了一个尝试状态工具,然后是其他工具。它正在寻找未决的变化,但不是孤立的变化。

3 个答案:

答案 0 :(得分:1)

您可以按照以下步骤使用Team Foundation Sidekicks搜索和撤消锁定:

  1. 安装该工具并启动它。
  2. 选择要连接的TFS服务器。
  3. 选择“工具\状态旁边”。
  4. 设置所需信息的“搜索条件”。
  5. 点击“搜索”按钮。
  6. 选择锁定的文件,然后单击“解锁”按钮。
  7. enter image description here

答案 1 :(得分:0)

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

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...

在出现的对话框中,选中&#34;显示远程工作区&#34;锁定的工作区出现在窗口中。然后选择它并单击&#34;删除&#34;。

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

<强>更新

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

答案 2 :(得分:0)

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

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. 如果可以,请及时拍摄服务器的快照。
  4. 如果出现严重错误,那么你将有一个或多个积分可以依靠。