ADOS本地应用:将SOAP的TrackMerges逻辑转为REST(6.0)实现
解决方案:ADOS REST 6.0 替代 TrackMerges 实现分支集成状态设置
针对你从SOAP迁移到REST 6.0的需求,ADOS REST API没有直接对应VersionControlServer.TrackMerges的方法,但可以通过获取分支合并提交记录 + 设置分支状态两个核心步骤实现等效功能,以下是基于VssConnection和GitHttpClient的具体实现:
1. 获取分支的合并记录(替代TrackMerges)
如果你的流水线自动合并是通过Pull Request完成,或者直接执行分支合并操作,可以通过以下方式筛选出目标分支中来自指定源分支的合并提交:
using Microsoft.VisualStudio.Services.Common; using Microsoft.VisualStudio.Services.Git.Client; using Microsoft.TeamFoundation.SourceControl.WebApi; // 初始化VssConnection var connection = new VssConnection(new Uri("http://your-ados-server:8080/tfs/Collection"), new VssCredentials()); var gitClient = connection.GetClient<GitHttpClient>(); // 定义源分支和目标分支信息 string projectName = "YourProject"; string repoId = "YourRepoIdOrName"; string sourceBranch = "refs/heads/develop"; string targetBranch = "refs/heads/main"; // 获取目标分支的提交列表,筛选合并提交 var targetCommits = await gitClient.GetCommitsAsync( project: projectName, repositoryId: repoId, searchCriteria: new GitQueryCommitsCriteria { ItemVersion = new GitVersionDescriptor { Version = targetBranch, VersionType = GitVersionType.Branch }, IncludeMergeCommitDetails = true, // 关键:启用合并提交详情 Top = 100 // 根据需要调整数量 }); // 筛选出源分支合并到目标分支的记录 var mergeRecords = new List<GitCommitRef>(); foreach (var commit in targetCommits) { if (commit.IsMerge && commit.Parents.Count > 1) { // 验证父提交是否来自源分支 foreach (var parent in commit.Parents) { var parentCommit = await gitClient.GetCommitAsync(projectName, repoId, parent.CommitId); if (parentCommit.BranchName == sourceBranch) { mergeRecords.Add(commit); break; } } } }
如果原SOAP代码基于TFVC分支,则改用TfvcHttpClient的GetMergeSourcesAsync获取变更集的合并来源:
var tfvcClient = connection.GetClient<TfvcHttpClient>(); // 获取指定变更集的合并来源 var mergeSources = await tfvcClient.GetMergeSourcesAsync( project: projectName, changesetId: targetChangesetId, targetBranch: "$/YourProject/Main");
2. 设置分支的集成状态
拿到合并记录后,使用GitHttpClient.CreateRefStatusAsync创建或更新分支的集成状态:
// 构造分支状态信息 var refStatus = new GitRefStatus { Name = "IntegratedStatus", // 自定义状态名称 State = GitStatusState.Succeeded, // 根据合并结果设置:Succeeded/Failed/Pending Description = $"Successfully merged from {sourceBranch} at {DateTime.Now}", Context = new GitStatusContext { Genre = "Integration", Name = "BranchIntegrated" } }; // 提交状态到目标分支 await gitClient.CreateRefStatusAsync( status: refStatus, project: projectName, repositoryId: repoId, filter: targetBranch);
关键说明
- 合并提交筛选:
IncludeMergeCommitDetails参数是获取合并提交详情的核心,确保能拿到父分支关联信息 - 状态上下文:
Context字段用于区分不同类型的状态(如集成状态、构建状态),避免和其他系统状态冲突 - TFVC兼容:如果原代码针对TFVC分支,需切换到
TfvcHttpClient,利用GetMergeSourcesAsync替代TrackMerges获取变更集合并关系
内容的提问来源于stack exchange,提问作者Hoehlenhund
相关产品推荐
相关产品推荐

