TFS从2010升级至2012/2015时单个集合触发空引用错误求助
我之前帮几个客户搞定过类似的TFS 2010升级到2012/2015时工作项跟踪组件的空引用错误,给你几个实际排查和修复的方向,都是经过验证有效的:
排查与修复方案
1. 检查工作项类型定义(WIT)的损坏
空引用问题最常见的原因就是WIT的XML定义有语法错误或缺失必要节点。你可以用witadmin exportwitd命令导出出问题集合里所有工作项类型的XML文件,然后逐一核查:
- 确保所有
<FIELD>节点都有正确的refname和name属性,没有遗漏System.Id、System.Title这类必填系统字段 - 检查
<WORKFLOW>节点里的状态转换配置,有没有无效的动作或缺失的状态引用 - 重点留意自定义控件或规则的配置——很多第三方扩展的WIT定义在升级到2012/2015时会出现schema不兼容的情况
2. 验证工作项仓库的数据库一致性
TFS的工作项跟踪依赖底层SQL数据库,你可以在SQL Server里针对该集合的数据库做以下检查:
- 运行
TFSServerStatus.exe /collection:http://你的TFS服务器地址/集合名称,查看是否有数据库一致性警告 - 执行SQL查询定位损坏的工作项记录:
如果查到结果,说明存在无效的工作项记录,需要先修复或删除这些条目后再重试升级SELECT * FROM [你的集合数据库名].[dbo].[WorkItemsAre] WHERE SystemId IS NULL SELECT * FROM [你的集合数据库名].[dbo].[WorkItemLongTexts] WHERE SystemId IS NULL
3. 禁用第三方扩展和自定义插件
很多时候升级失败是因为第三方工作项插件(比如自定义控件、报表扩展)在新版本TFS里不兼容。你可以先:
- 在升级前移除TFS服务器上所有第三方扩展
- 临时禁用工作项跟踪的自定义插件:修改TFS应用服务器上的
web.config,把<add key="WorkItemTracking.WorkItemFilter" value="..." />里的自定义过滤器暂时注释掉,升级完成后再恢复
4. 尝试分步升级
如果直接从2010跳到2015失败,建议先升级到2012,完成所有验证后再升级到2015。分步升级不仅能帮你定位是哪个版本的升级步骤触发了问题,而且TFS 2012的升级工具对2010的兼容性更好,可能自动修复一些WIT定义的小问题
5. 复查升级前置条件
确保你没漏掉关键的升级前置步骤:
- 对TFS 2010的所有集合执行完整备份,包括数据库和应用层数据
- 运行
PreUpgradeCheck.exe工具——别忽略这个工具的输出,哪怕你觉得之前的日志没信息,这里可能藏着被你漏掉的警告 - 确认SQL Server版本符合目标TFS的要求:TFS 2012支持SQL 2008R2及以上,TFS 2015支持SQL 2012及以上
小贴士:如果以上方法都没解决,你可以试试创建一个空白集合,把出问题集合里的项目逐一迁移过去(用TFS项目迁移工具或手动导出导入WIT、工作项),再升级新集合。这种方法虽然繁琐,但能绕过集合底层的损坏问题
内容的提问来源于stack exchange,提问作者maouriceg
相关产品推荐
相关产品推荐

