Tfs / Azure DevOps 客户端库合并 Azure DevOps 分支上的冲突解决

Posted

技术标签:

【中文标题】Tfs / Azure DevOps 客户端库合并 Azure DevOps 分支上的冲突解决【英文标题】:Tfs / AzureDevOps client libraries merge conflict resolution on AzureDevOps branches 【发布时间】:2020-03-27 21:49:13 【问题描述】:

我编写了一些 c# 代码,旨在自动化相关 tfvc 分支之间的 AzureDevOps 合并,从而尝试使它们保持同步(不执行无根据的合并)。

这是通过依赖位于 Microsoft.TeamFoundationServer.ExtendedClientMicrosoft.TeamFoundationServer.Client NuGet 包中的客户端库来实现的。

代码在Microsoft.TeamFoundation.VersionControl.Client 内的Workspace 类上使用“Merge”方法:

GetStatus status = workspace.Merge(sourceBranch,
                               destinationBranch,
                               vsFromChangeset,
                               vsToChangeset,
                               LockLevel.None,
                               RecursionType.Full,
                               MergeOptions.None); 

int numberOfConflicts = status.NumConflicts;

合并完成后,我检查“GetStatus”对象上的 NumConflicts 字段的状态,以确定是否发生了合并冲突。 如果确实如此,我会停止该过程,并且需要手动解决这个特定的合并问题——即在 Visual Studio 中合并(我使用 VS2017 Prof)。 这并不是什么大问题,因为从自动合并确实成功的时候获得的生产力就足够了。

我无法解释的奥秘是:

在大多数情况下,当客户端库合并指示合并冲突,然后通过 Visual Studio 完成合并时,Visual Studio 会在没有提及合并冲突的情况下执行此操作。没问题。

看起来好像 Visual Studio 中有一个额外级别的“合并冲突解决逻辑”,使其能够执行比客户端库更高级的合并冲突解决类型? 但我可能在这里偏离了目标????

也就是说,MergeOptions 枚举的用法(如 here 解释的那样)对我来说并不完全清楚,所以这可能是导致头痛的原因。任何详细说明该主题的资源将不胜感激。 MergeOptions 当前设置为 none,这适用于大多数情况。

关于导致这种行为的原因有什么想法吗? 谢谢!

【问题讨论】:

也许这篇文章能帮到你blogs.microsoft.co.il/shair/2009/20/tfs-api-part-19-merge 感谢 Shayki 的链接!它确实说明了 MergeOptions 枚举,但遗憾的是它并没有真正解释我所目睹的奇怪行为。 如果在 Visual Studio 中禁用“尝试在生成冲突时自动解决冲突”选项,您会得到相同的行为吗? 嘿,埃迪,谢谢你的建议。因此,在蝙蝠中,Visual Studio 似乎确实包含一些额外的逻辑层,有助于解决合并冲突。实际上,我很惊讶没有人对此发表评论,以揭开这个问题的神秘面纱......在 api 方面,我没有看到任何关于“自动解决冲突”方向的暗示我已经禁用了你提到的选项( Visual Studio 中的“自动解决冲突”),并在场景再次发生时立即尝试。随时通知您。 MergeOptions 枚举中只有以下选项可用:MergeOptions.AlwaysAcceptMine MergeOptions.Baseless MergeOptions.ForceMerge MergeOptions.NoMerge MergeOptions.None 【参考方案1】:

通过更改 Microsoft.TeamFoundation.VersionControl.Client.Workspace 类的 Merge 方法中使用的 mergeOptions 参数解决了这个问题。

使用枚举 Microsoft.TeamFoundation.VersionControl.Common.MergeOptionsEx 上的合并选项 而不是 Microsoft.TeamFoundation.VersionControl.Client.MergeOptions 为我解决了这个问题。

我现在已经看到 80 多个自动合并完美地工作,并且不再有以前的不稳定行为。合并命令应如下所示:

GetStatus status = workspace.Merge(sourceBranch,
                           destinationBranch,
                           vsFromChangeset,
                           vsToChangeset,
                           LockLevel.None,
                           RecursionType.Full,
                           MergeOptionsEx.None); 

所以我的问题的答案是在 social.msdn post 的底部找到的,作者是无名英雄 Mariusz Skoczylas。非常感谢!

MergeOptionsEx的官方文档可以找到here

【讨论】:

以上是关于Tfs / Azure DevOps 客户端库合并 Azure DevOps 分支上的冲突解决的主要内容,如果未能解决你的问题,请参考以下文章

重写Azure DevOps Server (TFS)中的Git版本记录

Azure DevOps Server:Git权限设置

text 创建构建代理 - devops azure(TFS在线)

为啥 Azure DevOps / TFS 中忽略了我的 repositoryPath?

将 Nuget 包从本地 TFS2017 发布到 azure DevOps

将 TFS2017.3 升级到 Azure DevOps 服务器