如何在Azure DevOps中使用斜杠获取分支名称?

时间:2020-01-28 20:04:09

标签: git azure azure-devops

Azure Devops提供了两个变量,其中包含有关当前git分支名称的信息:$(Build.SourceBranchName)$(Build.SourceBranch)

尽管SourceBranch包含对分支的完整引用,但是SourceBranchName仅包含简短的分支名称。

不幸的是,当分支名称包含斜杠(/)时,该行为有点意外:

+---------------------------------------------------------------------------------------------------------+
| Situation                     | Git branch name  | Build.SourceBranch          | Build.SourceBranchName |
|---------------------------------------------------------------------------------------------------------|
| branch name contains no slash | mybranch         | refs/heads/mybranch         | mybranch               |
| branch name contains slash    | release/mybranch | refs/heads/release/mybranch | mybranch               |
+---------------------------------------------------------------------------------------------------------+

斜杠前的分支名称部分不被视为分支名称的一部分。我的同事指出,这是documented behavior of Azure Devops

Git仓库分支或请求请求:引用中的最后一个路径段。例如,在refs / heads / master中,此值为master。在refs / heads / feature / tools中,此值为工具。

我不确定这种行为是否特别有用:我想检出分支,并需要将分支名称​​ include 放在斜杠上。另外,如果将斜杠前的部分去掉,则实际路径可能会造成混淆,因为名称可能不明确。

我需要分支名称​​包括斜杠。有没有简单的方法可以得到它?为了安全起见,我是否总是需要使用完整的裁判?

2 个答案:

答案 0 :(得分:6)

我总是在脚本中使用Build.SourceBranch。只需将其分配给新变量,然后从一开始就删除refs/heads/。我只用于CI和PR:

  1. 对于CI。我使用Build.SourceBranch变量而不使用refs/heads。我使用PowerShell:

$ branchSource =“ $(Build.SourceBranch)”
$ branchSourcePath = $ branchSource-替换“ refs / heads /”,“”

  1. 对于PR。我使用System.PullRequest.SourceBranch变量而不使用refs/heads,因为Build.SourceBranch包含远程PR的路径。替换与第一个选项相同,只是使用了正确的变量。

$ branchSource =“ $(System.PullRequest.SourceBranch)”
$ branchSourcePath = $ branchSource-替换“ refs / heads /”,“”

答案 1 :(得分:4)

在PR上构建时,可以使用System.PullRequest.SourceBranchSystem.PullRequest.TargetBranch变量。

System.PullRequest.TargetBranch

作为拉取请求目标的分支。例如: refs/heads/master。仅当构建时才初始化此变量 由于Git PR受分支机构政策的影响而运行。

Use Predefined Build Variables

此外,如果要使用完整路径或短路径,还可以根据需要定义自己的变量。

只需创建一个bash脚本,即可将较短的分支名称分配给变量。

# Bash script
BRANCH_NAME=$(echo "$(System.PullRequest.TargetBranch)" | awk -F/ '{print $NF}')
echo "##vso[task.setvariable variable=PullRequest_Target_Branch;]$BRANCH_NAME"

然后,您可以稍后在管道中引用$(PullRequest_Target_Branch)。