如何通过编程方式从工作项中检索变更集?
获取关联特定工作项的变更集列表(可行方案)
这个需求完全可行,你之前用WIQL没成功是因为没用到工作项链接查询来关联变更集。以下是具体实现步骤:
核心思路
工作项与变更集(Git提交/TFVC变更集)通过ArtifactLink类型的关联链接绑定,你可以通过WIQL查询获取这些关联,再解析链接信息调用对应API获取变更集详情。
1. 用WIQL查询关联的变更集链接
使用WorkItemLinks查询类型,指定工作项ID和关联链接类型(Git用Fixed in Commit,TFVC用Fixed in Changeset):
SELECT [System.Id], [System.Title] FROM WorkItemLinks WHERE ( [Source].[System.Id] = @WorkItemId AND [System.Links.LinkType] = 'Fixed in Commit' ) ORDER BY [System.Id] MODE (Recursive)
通过REST API执行该查询的请求示例:
POST https://dev.azure.com/{organization}/{project}/_apis/wit/wiql?api-version=7.1-preview.2 Content-Type: application/json { "query": "SELECT [System.Id], [System.Title] FROM WorkItemLinks WHERE ([Source].[System.Id] = 1234 AND [System.Links.LinkType] = 'Fixed in Commit') ORDER BY [System.Id] MODE (Recursive)" }
2. 解析关联链接并获取变更集详情
查询结果中,Target.Url是变更集的Artifact链接,格式如下:
- Git提交:
vstfs:///Git/Commit/{project-guid}/{repo-guid}/{commit-id} - TFVC变更集:
vstfs:///VersionControl/Changeset/{changeset-id}
解析出ID后,调用对应API获取详情:
- Git提交API:
GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repo-id}/commits/{commit-id}?api-version=7.1-preview.1 - TFVC变更集API:
GET https://dev.azure.com/{organization}/{project}/_apis/tfvc/changesets/{changeset-id}?api-version=7.1-preview.1
3. 完整代码示例(C# + Azure DevOps SDK)
using Microsoft.VisualStudio.Services.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models; using Microsoft.TeamFoundation.SourceControl.WebApi; var orgUrl = "https://dev.azure.com/your-organization"; var pat = "your-personal-access-token"; var targetWorkItemId = 1234; // 初始化连接 var connection = new VssConnection(new Uri(orgUrl), new VssBasicCredential(string.Empty, pat)); var witClient = connection.GetClient<WorkItemTrackingHttpClient>(); // 执行WIQL查询 var wiql = new Wiql { Query = $"SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.Id] = {targetWorkItemId} AND [System.Links.LinkType] = 'Fixed in Commit') MODE (Recursive)" }; var queryResult = await witClient.QueryByWiqlAsync(wiql); // 遍历关联链接并获取变更集详情 foreach (var link in queryResult.WorkItemRelations.Where(l => l.Target != null)) { var artifactUrl = link.Target.Url; var urlSegments = artifactUrl.Split('/'); // 解析Git提交信息 var commitId = urlSegments[^1]; var repoId = urlSegments[^2]; var gitClient = connection.GetClient<GitHttpClient>(); var commit = await gitClient.GetCommitAsync(repoId, commitId); // 输出变更集信息 Console.WriteLine($"提交ID: {commitId}"); Console.WriteLine($"作者: {commit.Author.Name}"); Console.WriteLine($"提交时间: {commit.Committer.Date:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($"提交注释: {commit.Comment}"); Console.WriteLine("------------------------"); }
注意事项
- 确保你的Personal Access Token(PAT)拥有Work Item Read和Git Read(或TFVC Read)权限
- 若工作项与变更集的关联类型不是
Fixed in Commit,可替换为Associated with等其他类型,具体可在Azure DevOps的链接类型设置中查看
内容的提问来源于stack exchange,提问作者Luke Clark
相关产品推荐
相关产品推荐

