使用 Azure DevOps api 从标签获取分支名称

问题描述 投票:0回答:1

使用 Azure DevOps API,如果我有与之关联的标签,有人可以帮助我获取实际的分支名称吗?

提前致谢。

到目前为止,我得到的 API 提供了特定存储库的所有标签,但这并没有给我任何与之相关的分支信息:

https://dev.azure.com/{{organization}}/{{project}}/_apis/git/repositories/{{repository_id}}/refs?filter=tags/&api-version=6.0
azure-devops azure-devops-rest-api
1个回答
2
投票

没有这样的 REST API 可以通过标签或提交获取分支名称。在Azure DevOps中,标签是根据提交id创建的,一个提交或标签可以属于多个分支。我们用下图来说明:

A---B---E---F master
     \     /
      C---D   dev

这是一个有master和dev分支的分支结构。并且dev分支通过commit F合并到master中。如果你想根据commit D获取分支名称,你将得到两个分支名称。提交 D 属于两个分支:dev(第一个父分支)和 master(第二个父分支)。

我们可以通过条件和多个REST API获取分支名称,也可以通过git cmd获取分支名称。

a。列出所有标签并获取

objectId

GET https://dev.azure.com/{Org name}/{Project name}/_apis/git/repositories/{repo ID}/refs?filter=tags/&api-version=6.0

b。通过objectId获取标签信息和提交ID

注意:字段

taggedObject.objectId
是提交ID

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/annotatedtags/{objectId}?api-version=6.0-preview.1

解决方法1

现在我们可以获取提交详细信息并获取包含给定提交的分支名称,我们可以使用 git 命令:

git branch --contains <commit>

解决方法2

我们可以通过此 API 列出分支上的所有提交信息

GET https://dev.azure.com/{Org name}/_apis/git/repositories/{repositoryId}/commits?searchCriteria.itemVersion.version={branch name}&api-version=6.0
现在,我们得到了包含标签的提交ID以及分支上的所有提交ID,添加

if{}

eq()
来检查它,如果返回True,我们就知道这个分支包含标签

更新1

我的测试仓库包含分支

main

test01
,分支
main
包含标签
Tag01
,分支
test01
包含标签
Tag01
tag02

Power shell 脚本:

$ListAllTagsURL="https://dev.azure.com/{Org name}/{Project name}/_apis/git/repositories/{Repo ID}/refs?filter=tags/&api-version=6.0" $PAT="{PAT}" $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PAT)")) $ListAllTags = Invoke-RestMethod -Uri $ListAllTagsURL -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get #List all tags name #write-host $ListAllTags.value.name foreach($Tag in $ListAllTags.value){ if($Tag.name -eq "{tag name such as refs/tags/Tag01}"){ $objectId = $Tag.objectId $TagName = $Tag.name } } #Get tag details and commit ID $TagURL="https://dev.azure.com/{Org name}/{Project name}/_apis/git/repositories/{Repo ID}/annotatedtags/$($objectId)?api-version=6.0-preview.1" $TagInfo = Invoke-RestMethod -Uri $TagURL -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get $TagCommitID = $TagInfo.taggedObject.objectId #write-host $TagCommitID #List all branch $url="https://dev.azure.com/{Org name}/{Project name}/_apis/git/repositories/{Repo ID}/refs?filter=heads&api-version=6.1-preview.1" $BranchInfo = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get foreach($Branch in $BranchInfo.value){ #write-host $Branch.name $BranchName = $Branch.name.split("/",3)[-1] #write-host $BranchName #List all commit ID via Branch Name $BranchDetailUrl="https://dev.azure.com/v-viliu/_apis/git/repositories/{Repo ID}/commits?searchCriteria.itemVersion.version=$($BranchName)&api-version=6.0" $BranchDetailInfo = Invoke-RestMethod -Uri $BranchDetailUrl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get #write-host $BranchDetailInfo.value.commitId foreach($CommitID in $BranchDetailInfo.value.commitId){ If($CommitID -eq $TagCommitID){ write-host $BranchName "Contain this tag" $TagName } } }
结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.