使用 Azure DevOps 从标签中获取分支名称 api
Get the branch name from tag using Azure DevOps api
如果我有关联的标签,有人可以帮我得到实际的分支名称吗?
Azure DevOps API 最适合我的情况。提前致谢。
到目前为止,我得到了 API,它给出了特别回购的所有标签,但这并没有解决我的问题。
https://dev.azure.com/{{organization}}/{{project}}/_apis/git/repositories/{{repository_id}}/refs?filter=tags/&api-version=6.0
但它没有给我任何与之相关的分支信息。
没有这样的 REST API 可以通过标签或提交获取分支名称。在 Azure DevOps 中,Tags 是根据 commit id 创建的,一个 commit 或 tag 可以属于多个分支。让我们用下图来说明:
A---B---E---F master
\ /
C---D dev
这是一个有master和dev分支的分支结构。 dev 分支合并到 master 与提交 F。如果你想根据提交 D 获取分支名称,你将获得两个分支名称。提交 D 属于两个分支:dev(第一个父级)和 master(第二个父级)。
我们可以通过条件和多个 REST APIs 获取分支名称,也可以通过 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
获取 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
我们可以 list all commits info on a branch 通过这个 API
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()
来检查它,如果 return 为真,我们可以知道这个分支包含标签
更新1
我的测试仓库包含分支 main
和 test01
,分支 main
包含标签 Tag01
,分支 test01
包含标签 Tag01
和 tag02
电源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
}
}
}
结果:
如果我有关联的标签,有人可以帮我得到实际的分支名称吗?
Azure DevOps API 最适合我的情况。提前致谢。
到目前为止,我得到了 API,它给出了特别回购的所有标签,但这并没有解决我的问题。
https://dev.azure.com/{{organization}}/{{project}}/_apis/git/repositories/{{repository_id}}/refs?filter=tags/&api-version=6.0
但它没有给我任何与之相关的分支信息。
没有这样的 REST API 可以通过标签或提交获取分支名称。在 Azure DevOps 中,Tags 是根据 commit id 创建的,一个 commit 或 tag 可以属于多个分支。让我们用下图来说明:
A---B---E---F master
\ /
C---D dev
这是一个有master和dev分支的分支结构。 dev 分支合并到 master 与提交 F。如果你想根据提交 D 获取分支名称,你将获得两个分支名称。提交 D 属于两个分支:dev(第一个父级)和 master(第二个父级)。
我们可以通过条件和多个 REST APIs 获取分支名称,也可以通过 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
获取 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
我们可以 list all commits info on a branch 通过这个 API
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()
来检查它,如果 return 为真,我们可以知道这个分支包含标签
更新1
我的测试仓库包含分支 main
和 test01
,分支 main
包含标签 Tag01
,分支 test01
包含标签 Tag01
和 tag02
电源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
}
}
}
结果: