Azure devops 使用Azure DevOps api从标记中获取分支名称

Azure devops 使用Azure DevOps api从标记中获取分支名称,azure-devops,azure-devops-rest-api,Azure Devops,Azure Devops Rest Api,如果我的标签与之关联,有人能帮我获得实际的分支名称吗 在我的情况下,Azure DevOps API将是最好的。提前谢谢 到目前为止,我得到了一个API,它提供了特别是回购协议的所有标签,但这并不能解决我的问题 https://dev.azure.com/{{organization}}/{{project}}/_apis/git/repositories/{{repository_id}}/refs?filter=tags/&api-version=6.0 但是它没有给我任何与之相关

如果我的标签与之关联,有人能帮我获得实际的分支名称吗

在我的情况下,Azure DevOps API将是最好的。提前谢谢

到目前为止,我得到了一个API,它提供了特别是回购协议的所有标签,但这并不能解决我的问题

https://dev.azure.com/{{organization}}/{{project}}/_apis/git/repositories/{{repository_id}}/refs?filter=tags/&api-version=6.0

但是它没有给我任何与之相关的分支信息。

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

A---B---E---F master
     \     /
      C---D   dev
这是一个带有master和dev分支的分支结构。和dev分支使用commit F合并到master中。如果您希望基于commit D获得分支名称,您将获得两个分支名称。提交D属于两个分支:dev(第一个父级)和master(第二个父级)

我们可以通过条件和多个RESTAPI获得分支名称,也可以通过git cmd获得分支名称

a。列出所有标记并获取
对象ID

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>
现在,我们得到包含标记和分支上所有提交id的提交id,添加
if{}
eq()
来检查它,如果它返回True,我们就可以知道这个分支包含标记

更新1

我的测试回购包含分支
main
test01
,分支
main
包含标签
Tag01
,分支
test01
包含标签
Tag01
tag02

powershell脚本:

$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
    }

}

}
结果:


嗨,这个问题怎么样?下面的答案解决了你的问题吗?如果没有,请告诉我有关此问题的最新信息。谢谢您的帮助!!我想知道如何在解决方案2中知道分支名称,我只想知道任何特定标记的分支名称。。非常感谢你的帮助!!您好@YouAreAwesome,我已经更新了答案,请检查更新1。非常感谢,只需提及一点,我不能像您提到的那样在另一个分支上再次使用相同的标记,我正在使用azure DevOps和集成git。
$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
    }

}

}