You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:05:26