0

我们需要将两个字段合并为一个。在配置中,有一个“doneMatch”特殊字符串,这似乎被附加到合并字段中。为什么需要这样做,有没有办法不将它也附加到目标字段?

例如,我有:
src.fieldA = "City"
src.fieldB = "State"

我想将这两个字段合并到 target.fieldA 作为“城市:州”。但是,我最终得到的是“City:State##DONE##”,我可以更改配置文件,以便它使用不同的 doneMatch,但它不能为空或空..所以如果我将其更改为“; ",那么结果字段将是 "City: State;"。由于某种原因,我必须结束字符/字符串。这是干什么用的?如果我将字段与较新的更新同步,它是否会检测到 target.fieldA 中以前的##DONE## 并认为它已经完成了合并,所以不会进行任何新的更改?

有人可以向我发送有关此功能的更多信息吗?

4

2 回答 2

1

我已经更新了 v9.0.1 的代码,它改变了 FieldMerge 的工作方式。它不再使用 doneMatch,而是要求所有 3 个字段都不同,如果已经完成则跳过。

 if (source.Fields.Contains(config.sourceField1) && source.Fields.Contains(config.sourceField2))
            {
                var val1 = source.Fields[config.sourceField1].Value != null ? source.Fields[config.sourceField1].Value.ToString() : string.Empty;
                var val2 = source.Fields[config.sourceField2].Value != null ? source.Fields[config.sourceField2].Value.ToString() : string.Empty;
                var valT = target.Fields[config.targetField].Value != null ? target.Fields[config.targetField].Value.ToString() : string.Empty;
                var newValT = string.Format(config.formatExpression, val1, val2);

                if (valT.Equals(newValT))
                {
                    Trace.WriteLine(string.Format("  [SKIP] field already merged {0}:{1}+{2} to {3}:{4}", source.Id, config.sourceField1, config.sourceField2, target.Id, config.targetField));
                } else
                {
                    target.Fields[config.targetField].Value = string.Format(config.formatExpression, val1, val2) + config.doneMatch;
                    Trace.WriteLine(string.Format("  [UPDATE] field merged {0}:{1}+{2} to {3}:{4}", source.Id, config.sourceField1, config.sourceField2, target.Id, config.targetField));
                }

            }

https://github.com/nkdAgility/azure-devops-migration-tools/pull/529

于 2020-08-13T11:44:18.937 回答
0

使用 Azure Devops 迁移工具测试字段合并,我也可以重现这种情况。该doneMatch字段在configuration.json文件中是必需的(默认为##Done##)。

似乎没有办法避免添加donematch到目标字段。由于我不是这个工具的开发者,所以我不确定这个字段的功能。

我想分享一个解决方法来解决这个问题。

解决方法:

您可以尝试将 设置" "为该doneMatch字段。( "doneMatch": " ")

例如:

 "FieldMaps": [
    {
      "ObjectType": "VstsSyncMigrator.Engine.Configuration.FieldMap.FieldMergeMapConfig",
      "WorkItemTypeName": "*",
      "sourceField1": "System.Description",
      "sourceField2": "Microsoft.VSTS.Common.AcceptanceCriteria",
      "targetField": "System.Description",
      "formatExpression": "{0} {1}",
      "doneMatch": " "
    }

由于配置文件是一个 Json 文件,您可以使用它" "来表示空格。

结果:

在此处输入图像描述

是否会检测到 target.fieldA 中先前的##DONE## 并认为它已经完成了合并,因此不会进行任何新的更改

根据我的测试,##Done##目标字段中的 不会影响其他操作。您仍然可以在此字段上进行操作。

更新:

上述方法仅适用于字段类型:Text (multiple lines). 如果该字段是其他类型,则此方法不起作用。

您可以创建一个新字段(Text (multiple lines))。然后您可以将目标字段设置为新字段。

例如

 "FieldMaps": [

 
    {
      "ObjectType": "VstsSyncMigrator.Engine.Configuration.FieldMap.FieldMergeMapConfig",
      "WorkItemTypeName": "*",
      "sourceField1": "Custom.test1",
      "sourceField2": "Custom.test2",
      "targetField": "Custom.test3",
      "formatExpression": "{0} {1}",
      "doneMatch": " "
    }
于 2020-08-04T06:08:54.843 回答