【问题标题】:Get the branch name from tag using Azure DevOps api使用 Azure DevOps api 从标记中获取分支名称
【发布时间】:2021-01-20 16:30:23
【问题描述】:

如果我有关联的标签,有人可以帮我获取实际的分支名称吗?

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】:

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

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

这是一个带有 master 和 dev 分支的分支结构。而dev分支与commit F合并到master中。如果你想根据commit D得到分支名,你会得到两个分支名。提交 D 属于两个分支:dev(第一个父级)和 master(第二个父级)。

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

一个。列出所有标签并获取objectId

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

b。通过 objectId 获取tag info 和提交 ID

注意:taggedObject.objectId 字段是提交 ID

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

解决方法 1

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

git branch --contains <commit>

解决方法 2

我们可以通过这个 API list all commits info on a branch

GET https://dev.azure.com/{Org name}/_apis/git/repositories/{repositoryId}/commits?searchCriteria.itemVersion.version={barnch name}&api-version=6.0

现在,我们得到包含标签和所有提交ID的提交ID,添加if{}eq()检查它,如果它返回True,我们可以知道这个分支包含标签

更新1

我的测试仓库包含分支maintest01,分支main 包含标签Tag01,分支test01 包含标签Tag01tag02

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
    }

}

}

结果:

【讨论】:

  • 感谢您的帮助!我想知道如何知道解决方法 2 中的分支名称,我只想知道任何特定标签的分支名称。非常感谢您的帮助!
  • 嗨@YouAreAwesome,我已经更新了答案,请检查update1。
  • 非常感谢,只提一点,我不能再为另一个分支使用相同的标签,就像你提到的那样,我正在使用带有集成 git 的 azure DevOps。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2021-07-25
  • 2021-10-20
  • 2020-11-02
  • 2019-10-27
  • 2019-04-25
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多