如何配置迁移已关闭的工作项?
How to Configure Migrating Closed Work Items?
我正在尝试将一个项目从我们的本地 ADOS 迁移到 ADO(云),并且部分成功了。似乎已关闭的工作项没有迁移。我已经检查了我的配置文件,但我没有检查 ClosedDate = ''
的限定符。我什至在查询位中专门添加了一个检查 ClosedDate != ''
的地方,当我尝试重新 运行 脚本时它仍然没有找到关闭的工作项。
我是运行 v11.9.29.0 的工具。
这是我的配置文件:
{
"Version": "11.9",
"LogLevel": "Verbose",
"MappingTools": [
{
"$type": "WorkItemTypeMappingTool",
"Enabled": true,
"WorkItemTypeDefinition": {
"sourceWorkItemTypeName": "targetWorkItemTypeName"
}
},
{
"$type": "WorkItemFieldMappingTool",
"Enabled": true,
"WorkItemFieldMaps": [
{
"$type": "MultiValueConditionalMapConfig",
"WorkItemTypeName": "*",
"sourceFieldsAndValues": {
"Field1": "Value1",
"Field2": "Value2"
},
"targetFieldsAndValues": {
"Field1": "Value1",
"Field2": "Value2"
}
},
{
"$type": "FieldBlankMapConfig",
"WorkItemTypeName": "*",
"targetField": "TfsMigrationTool.ReflectedWorkItemId"
},
{
"$type": "FieldValueMapConfig",
"WorkItemTypeName": "*",
"sourceField": "System.State",
"targetField": "System.State"
},
{
"$type": "FieldtoFieldMapConfig",
"WorkItemTypeName": "*",
"sourceField": "Microsoft.VSTS.Common.BacklogPriority",
"targetField": "Microsoft.VSTS.Common.StackRank"
},
{
"$type": "FieldtoFieldMultiMapConfig",
"WorkItemTypeName": "*",
"SourceToTargetMappings": {
"SourceField1": "TargetField1",
"SourceField2": "TargetField2"
}
},
{
"$type": "FieldtoTagMapConfig",
"WorkItemTypeName": "*",
"sourceField": "System.State",
"formatExpression": "ScrumState:{0}"
},
{
"$type": "FieldMergeMapConfig",
"WorkItemTypeName": "*",
"sourceField1": "System.Description",
"sourceField2": "Microsoft.VSTS.Common.AcceptanceCriteria",
"targetField": "System.Description",
"formatExpression": "{0} <br/><br/><h3>Acceptance Criteria</h3>{1}",
"doneMatch": "##DONE##"
},
{
"$type": "RegexFieldMapConfig",
"WorkItemTypeName": "*",
"sourceField": "COMPANY.PRODUCT.Release",
"targetField": "COMPANY.DEVISION.MinorReleaseVersion",
"pattern": "PRODUCT \d{4}.(\d{1})",
"replacement": ""
},
{
"$type": "FieldValuetoTagMapConfig",
"WorkItemTypeName": "*",
"sourceField": "Microsoft.VSTS.CMMI.Blocked",
"pattern": "Yes",
"formatExpression": "{0}"
},
{
"$type": "TreeToTagMapConfig",
"WorkItemTypeName": "*",
"toSkip": 3,
"timeTravel": 1
}
]
},
{
"$type": "WorkItemGitRepoMappingTool",
"Enabled": true,
"WorkItemGitRepos": {
"sourceRepoName": "targetRepoName"
}
}
],
"Source": {
"$type": "TfsTeamProjectConfig",
"Collection": "",
"Project": "",
"ReflectedWorkItemIDFieldName": "TfsMigrationTool.ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Target": {
"$type": "TfsTeamProjectConfig",
"Collection": "",
"Project": "",
"ReflectedWorkItemIDFieldName": "ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Processors": [
{
"$type": "WorkItemMigrationConfig",
"ReplayRevisions": true,
"PrefixProjectToNodes": false,
"UpdateCreatedDate": true,
"UpdateCreatedBy": true,
"BuildFieldTable": false,
"AppendMigrationToolSignatureFooter": false,
"QueryBit": "AND [Microsoft.VSTS.Common.ClosedDate] != '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
//"QueryBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc",
"Enabled": true,
"LinkMigration": true,
"AttachmentMigration": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"FixHtmlAttachmentLinks": false,
"SkipToFinalRevisedWorkItemType": false,
"WorkItemCreateRetryLimit": 5,
"FilterWorkItemsThatAlreadyExistInTarget": true,
"PauseAfterEachWorkItem": false,
"AttachmentMaxSize": 480000000,
"CollapseRevisions": false,
"LinkMigrationSaveEachAsAdded": false
},
{
"$type": "WorkItemTrackingProcessorOptions",
"Enabled": false,
"ReplayRevisions": true,
"PrefixProjectToNodes": false,
"CollapseRevisions": false,
"WorkItemCreateRetryLimit": 5,
"Enrichers": [
{
"$type": "PauseAfterEachItemOptions",
"Enabled": true
},
{
"$type": "FilterWorkItemsThatAlreadyExistInTargetOptions",
"Enabled": true,
"Query": {
"WhereBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc"
}
},
{
"$type": "AppendMigrationToolSignatureFooterOptions",
"Enabled": false
},
{
"$type": "SkipToFinalRevisedWorkItemTypeOptions",
"Enabled": false
}
],
"Endpoints": [
{
"$type": "FileSystemWorkItemEndpointOptions",
"Direction": "Source",
"FileStore": ".\Store\Source\",
"Query": {
"WhereBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc"
},
"Enrichers": [
{
"$type": "FileSystemWorkItemAttachmentEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"AttachmentMaxSize": 480000000
}
]
},
{
"$type": "TfsWorkItemEndPointOptions",
"Direction": "Target",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Enrichers": [
{
"$type": "TfsWorkItemAttachmentEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"AttachmentMaxSize": 480000000
},
{
"$type": "TfsWorkItemEmbedEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\"
},
{
"$type": "TfsWorkItemLinkEnricherOptions",
"Enabled": true,
"LinkMigrationSaveEachAsAdded": true
},
{
"$type": "TfsWorkItemCreatedEnricherOptions",
"Enabled": true,
"UpdateCreatedDate": true,
"UpdateCreatedBy": true
},
{
"$type": "TfsWorkItemFieldTableEnricherOptions",
"Enabled": true
}
]
}
]
},
{
"$type": "TfsAreaAndIterationProcessorOptions",
"Enabled": true,
"PrefixProjectToNodes": false,
"Source": {
"$type": "TfsEndpointOptions",
"Direction": "Source",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Organisation": "",
"Project": "",
"ReflectedWorkItemIdField": "TfsMigrationTool.ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Target": {
"$type": "TfsEndpointOptions",
"Direction": "Target",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Organisation": "",
"Project": "",
"ReflectedWorkItemIdField": "ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
}
}
]
}
但是,当 运行 脚本时,我在日志中看到这个查询:
[11:49:53 DBG] WorkItemQuery: ===========GetWorkItems=============
[11:49:53 DBG] WorkItemQuery: TeamProjectCollection:
[11:49:53 DBG] WorkItemQuery: Query: SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = 'PROJECTNAME' AND [Microsoft.VSTS.Common.ClosedDate] = '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc
[11:49:53 DBG] WorkItemQuery: Paramiters: {"TeamProject": ""}
[11:49:53 DBG] WorkItemQuery: TeamProject:
[11:50:02 INF] Replay all revisions of 96 work items?
[11:50:02 INF] Found target project as
[11:50:02 INF] [FilterWorkItemsThatAlreadyExistInTarget] is enabled. Searching for work items that have already been migrated to the target...
[11:50:02 DBG] FilterExistingWorkItems: START |
[11:50:02 DBG] FilterByTarget: Query Execute...
[11:50:02 DBG] WorkItemQuery: ===========GetWorkItems=============
[11:50:02 DBG] WorkItemQuery: TeamProjectCollection:
[11:50:02 DBG] WorkItemQuery: Query: SELECT [System.Id], [ReflectedWorkItemId] FROM WorkItems WHERE [System.TeamProject] = 'PROJECTNAME' AND [Microsoft.VSTS.Common.ClosedDate] = '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc
[11:50:02 DBG] WorkItemQuery: Paramiters: {"TeamProject": ""}
[11:50:02 DBG] WorkItemQuery: TeamProject:
[11:51:19 DBG] FilterByTarget: ... query complete.
[11:51:19 DBG] FilterByTarget: Found 650 based on the WIQLQueryBit in the target system.
...
[11:51:20 DBG] FilterByTarget: After removing all found work items there are 0 remaining to be migrated.
[11:51:20 DBG] FilterByTarget: END
[11:51:20 INF] !! After removing all found work items there are 0 remaining to be migrated.
我的配置文件有什么问题?
似乎我在 JSON 配置文件中的参数名称有误。它应该是“WIQLQueryBit”而不仅仅是“QueryBit”。我确定我的配置是从示例文档集中获取的,但在使用该工具重新生成后,它具有正确的参数名称。
除此之外,从该工具的 v11.9.37.0 开始,我必须在 FieldValueMapConfig 中为 System.State 添加额外的映射。
"valueMapping": {
"Approved": "New",
"New": "New",
"Committed": "Active",
"In Progress": "Active",
"Active": "Active",
"To Do": "New",
"Done": "Closed",
"Resolved": "Resolved",
"Closed": "Closed",
"Removed": "Removed"
}
我正在尝试将一个项目从我们的本地 ADOS 迁移到 ADO(云),并且部分成功了。似乎已关闭的工作项没有迁移。我已经检查了我的配置文件,但我没有检查 ClosedDate = ''
的限定符。我什至在查询位中专门添加了一个检查 ClosedDate != ''
的地方,当我尝试重新 运行 脚本时它仍然没有找到关闭的工作项。
我是运行 v11.9.29.0 的工具。
这是我的配置文件:
{
"Version": "11.9",
"LogLevel": "Verbose",
"MappingTools": [
{
"$type": "WorkItemTypeMappingTool",
"Enabled": true,
"WorkItemTypeDefinition": {
"sourceWorkItemTypeName": "targetWorkItemTypeName"
}
},
{
"$type": "WorkItemFieldMappingTool",
"Enabled": true,
"WorkItemFieldMaps": [
{
"$type": "MultiValueConditionalMapConfig",
"WorkItemTypeName": "*",
"sourceFieldsAndValues": {
"Field1": "Value1",
"Field2": "Value2"
},
"targetFieldsAndValues": {
"Field1": "Value1",
"Field2": "Value2"
}
},
{
"$type": "FieldBlankMapConfig",
"WorkItemTypeName": "*",
"targetField": "TfsMigrationTool.ReflectedWorkItemId"
},
{
"$type": "FieldValueMapConfig",
"WorkItemTypeName": "*",
"sourceField": "System.State",
"targetField": "System.State"
},
{
"$type": "FieldtoFieldMapConfig",
"WorkItemTypeName": "*",
"sourceField": "Microsoft.VSTS.Common.BacklogPriority",
"targetField": "Microsoft.VSTS.Common.StackRank"
},
{
"$type": "FieldtoFieldMultiMapConfig",
"WorkItemTypeName": "*",
"SourceToTargetMappings": {
"SourceField1": "TargetField1",
"SourceField2": "TargetField2"
}
},
{
"$type": "FieldtoTagMapConfig",
"WorkItemTypeName": "*",
"sourceField": "System.State",
"formatExpression": "ScrumState:{0}"
},
{
"$type": "FieldMergeMapConfig",
"WorkItemTypeName": "*",
"sourceField1": "System.Description",
"sourceField2": "Microsoft.VSTS.Common.AcceptanceCriteria",
"targetField": "System.Description",
"formatExpression": "{0} <br/><br/><h3>Acceptance Criteria</h3>{1}",
"doneMatch": "##DONE##"
},
{
"$type": "RegexFieldMapConfig",
"WorkItemTypeName": "*",
"sourceField": "COMPANY.PRODUCT.Release",
"targetField": "COMPANY.DEVISION.MinorReleaseVersion",
"pattern": "PRODUCT \d{4}.(\d{1})",
"replacement": ""
},
{
"$type": "FieldValuetoTagMapConfig",
"WorkItemTypeName": "*",
"sourceField": "Microsoft.VSTS.CMMI.Blocked",
"pattern": "Yes",
"formatExpression": "{0}"
},
{
"$type": "TreeToTagMapConfig",
"WorkItemTypeName": "*",
"toSkip": 3,
"timeTravel": 1
}
]
},
{
"$type": "WorkItemGitRepoMappingTool",
"Enabled": true,
"WorkItemGitRepos": {
"sourceRepoName": "targetRepoName"
}
}
],
"Source": {
"$type": "TfsTeamProjectConfig",
"Collection": "",
"Project": "",
"ReflectedWorkItemIDFieldName": "TfsMigrationTool.ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Target": {
"$type": "TfsTeamProjectConfig",
"Collection": "",
"Project": "",
"ReflectedWorkItemIDFieldName": "ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Processors": [
{
"$type": "WorkItemMigrationConfig",
"ReplayRevisions": true,
"PrefixProjectToNodes": false,
"UpdateCreatedDate": true,
"UpdateCreatedBy": true,
"BuildFieldTable": false,
"AppendMigrationToolSignatureFooter": false,
"QueryBit": "AND [Microsoft.VSTS.Common.ClosedDate] != '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
//"QueryBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc",
"Enabled": true,
"LinkMigration": true,
"AttachmentMigration": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"FixHtmlAttachmentLinks": false,
"SkipToFinalRevisedWorkItemType": false,
"WorkItemCreateRetryLimit": 5,
"FilterWorkItemsThatAlreadyExistInTarget": true,
"PauseAfterEachWorkItem": false,
"AttachmentMaxSize": 480000000,
"CollapseRevisions": false,
"LinkMigrationSaveEachAsAdded": false
},
{
"$type": "WorkItemTrackingProcessorOptions",
"Enabled": false,
"ReplayRevisions": true,
"PrefixProjectToNodes": false,
"CollapseRevisions": false,
"WorkItemCreateRetryLimit": 5,
"Enrichers": [
{
"$type": "PauseAfterEachItemOptions",
"Enabled": true
},
{
"$type": "FilterWorkItemsThatAlreadyExistInTargetOptions",
"Enabled": true,
"Query": {
"WhereBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc"
}
},
{
"$type": "AppendMigrationToolSignatureFooterOptions",
"Enabled": false
},
{
"$type": "SkipToFinalRevisedWorkItemTypeOptions",
"Enabled": false
}
],
"Endpoints": [
{
"$type": "FileSystemWorkItemEndpointOptions",
"Direction": "Source",
"FileStore": ".\Store\Source\",
"Query": {
"WhereBit": "AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan')",
"OrderBit": "[System.ChangedDate] desc"
},
"Enrichers": [
{
"$type": "FileSystemWorkItemAttachmentEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"AttachmentMaxSize": 480000000
}
]
},
{
"$type": "TfsWorkItemEndPointOptions",
"Direction": "Target",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Enrichers": [
{
"$type": "TfsWorkItemAttachmentEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\",
"AttachmentMaxSize": 480000000
},
{
"$type": "TfsWorkItemEmbedEnricherOptions",
"Enabled": true,
"AttachmentWorkingPath": "c:\temp\WorkItemAttachmentWorkingFolder\"
},
{
"$type": "TfsWorkItemLinkEnricherOptions",
"Enabled": true,
"LinkMigrationSaveEachAsAdded": true
},
{
"$type": "TfsWorkItemCreatedEnricherOptions",
"Enabled": true,
"UpdateCreatedDate": true,
"UpdateCreatedBy": true
},
{
"$type": "TfsWorkItemFieldTableEnricherOptions",
"Enabled": true
}
]
}
]
},
{
"$type": "TfsAreaAndIterationProcessorOptions",
"Enabled": true,
"PrefixProjectToNodes": false,
"Source": {
"$type": "TfsEndpointOptions",
"Direction": "Source",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Organisation": "",
"Project": "",
"ReflectedWorkItemIdField": "TfsMigrationTool.ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"PersonalAccessToken": "",
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
},
"Target": {
"$type": "TfsEndpointOptions",
"Direction": "Target",
"AccessToken": "",
"Query": {
"Query": "SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = @TeamProject AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc"
},
"Organisation": "",
"Project": "",
"ReflectedWorkItemIdField": "ReflectedWorkItemId",
"AuthenticationMode": "Prompt",
"AllowCrossProjectLinking": false,
"LanguageMaps": {
"AreaPath": "Area",
"IterationPath": "Iteration"
}
}
}
]
}
但是,当 运行 脚本时,我在日志中看到这个查询:
[11:49:53 DBG] WorkItemQuery: ===========GetWorkItems=============
[11:49:53 DBG] WorkItemQuery: TeamProjectCollection:
[11:49:53 DBG] WorkItemQuery: Query: SELECT [System.Id], [System.Tags] FROM WorkItems WHERE [System.TeamProject] = 'PROJECTNAME' AND [Microsoft.VSTS.Common.ClosedDate] = '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc
[11:49:53 DBG] WorkItemQuery: Paramiters: {"TeamProject": ""}
[11:49:53 DBG] WorkItemQuery: TeamProject:
[11:50:02 INF] Replay all revisions of 96 work items?
[11:50:02 INF] Found target project as
[11:50:02 INF] [FilterWorkItemsThatAlreadyExistInTarget] is enabled. Searching for work items that have already been migrated to the target...
[11:50:02 DBG] FilterExistingWorkItems: START |
[11:50:02 DBG] FilterByTarget: Query Execute...
[11:50:02 DBG] WorkItemQuery: ===========GetWorkItems=============
[11:50:02 DBG] WorkItemQuery: TeamProjectCollection:
[11:50:02 DBG] WorkItemQuery: Query: SELECT [System.Id], [ReflectedWorkItemId] FROM WorkItems WHERE [System.TeamProject] = 'PROJECTNAME' AND [Microsoft.VSTS.Common.ClosedDate] = '' AND [System.WorkItemType] NOT IN ('Test Suite', 'Test Plan') ORDER BY [System.ChangedDate] desc
[11:50:02 DBG] WorkItemQuery: Paramiters: {"TeamProject": ""}
[11:50:02 DBG] WorkItemQuery: TeamProject:
[11:51:19 DBG] FilterByTarget: ... query complete.
[11:51:19 DBG] FilterByTarget: Found 650 based on the WIQLQueryBit in the target system.
...
[11:51:20 DBG] FilterByTarget: After removing all found work items there are 0 remaining to be migrated.
[11:51:20 DBG] FilterByTarget: END
[11:51:20 INF] !! After removing all found work items there are 0 remaining to be migrated.
我的配置文件有什么问题?
似乎我在 JSON 配置文件中的参数名称有误。它应该是“WIQLQueryBit”而不仅仅是“QueryBit”。我确定我的配置是从示例文档集中获取的,但在使用该工具重新生成后,它具有正确的参数名称。
除此之外,从该工具的 v11.9.37.0 开始,我必须在 FieldValueMapConfig 中为 System.State 添加额外的映射。
"valueMapping": {
"Approved": "New",
"New": "New",
"Committed": "Active",
"In Progress": "Active",
"Active": "Active",
"To Do": "New",
"Done": "Closed",
"Resolved": "Resolved",
"Closed": "Closed",
"Removed": "Removed"
}