有没有办法在不将 doneMatch 添加到字段中的情况下合并字段?

Is there any way to merge fields without adding the doneMatch into the field?

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

例如,我有:
src.fieldA = "城市"
src.fieldB = "州"

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

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

使用Azure Devops Migration工具测试字段合并,我也可以重现这种情况。 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文件,可以用" "表示空格。

结果:

is it going to detect the previous ##DONE## in the target.fieldA and think it's already done the merge, so would not make any new changes

根据我的测试,目标字段中的##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": " "
    }

我更新了 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