迁移含已删除团队项目引用的WorkItem,如何保留完整修订历史?
解决VstsSyncMigrator迁移含已删除项目引用WorkItem的完整修订历史问题
遇到这个问题的核心原因是:迁移工具在加载WorkItem的旧修订记录时,尝试引用已经被删除的团队项目ID,触发了TF26192异常。要在保留完整有效修订历史的前提下解决,有以下几种可行方案:
方案1:修改VstsSyncMigrator源代码,添加异常捕获处理
这是最直接的自定义解决方案,针对报错的核心逻辑做调整:
- 克隆VstsSyncMigrator的官方源代码到本地
- 打开
src/VstsSyncMigrator.Core/Execution/ComponentContext/WorkItemStoreContext.cs文件,定位到GetRevision方法(对应报错信息里的line 202) - 在实例化特定修订的WorkItem时,添加异常捕获逻辑,跳过无效修订:
public WorkItem GetRevision(WorkItem workItem, int revision) { try { return new WorkItem(_store, workItem.Id, revision); } catch (Microsoft.TeamFoundation.WorkItemTracking.Client.DeniedOrNotExistException ex) { if (ex.Message.Contains("TF26192")) { _logger.LogWarning($"Skipping revision {revision} for work item {workItem.Id}: 引用的团队项目已不存在(TF26192)。"); return null; } // 非目标异常重新抛出 throw; } }
- 打开
src/VstsSyncMigrator.Core/Execution/MigrationContext/WorkItemMigrationContext.cs文件,找到ReplayRevisions方法,在处理修订前添加null检查:
// 在循环处理修订的逻辑中添加 var sourceRevision = sourceStore.GetRevision(sourceWorkItem, current); if (sourceRevision == null) { current++; continue; }
- 重新编译项目,使用自定义编译后的工具执行迁移
修改后,工具会自动跳过那些引用已删除项目的无效修订,同时完整保留其他所有有效修订的历史记录。
方案2:临时恢复已删除的团队项目(如果条件允许)
如果源组织中被删除的项目还在30天的恢复窗口期内,可以采用这个零代码方案:
- 登录Azure DevOps源组织,进入项目设置 > 项目
- 在「已删除项目」列表中找到ID为129的项目,点击恢复
- 完成WorkItem迁移后,再重新删除该项目
这个方法无需修改代码,但依赖于项目仍处于可恢复周期内,适合临时快速解决问题。
方案3:自定义迁移处理器(进阶方案)
如果不想修改官方工具的源代码,可以创建自定义的WorkItem迁移处理器:
- 继承官方的
WorkItemMigrationContext类 - 重写
GetRevision和ReplayRevisions方法,实现方案1中的异常处理逻辑 - 在迁移配置文件中,将
ObjectType替换为自定义处理器的类型路径
注意事项
- 方案1修改代码后,需要维护自定义版本的迁移工具,后续官方更新时需要手动合并代码
- 跳过无效修订属于折中方案,迁移后的WorkItem历史会缺失那些关联已删除项目的修订,但其余完整修订会被保留,这是无法恢复原项目情况下的最优选择
内容的提问来源于stack exchange,提问作者João Macedo Pinto
相关产品推荐
相关产品推荐

