0

如何使用 bash 从字符串中提取分支名称?例如,我有以下命令:

branch=$(git branch -a --contains $sha)

这可能会返回:

  1. * branch-1.0(前缀始终是星号)

  2. branch-2.0 remotes/origin/branch-2.0(这里可能是换行而不是空格)

  3. master remotes/origin/master (这里可能是换行而不是空格)

而且我只需要分支名称(并且只需要一次)master-branch-2.0branch-1.0. 我知道它可以用sed命令来完成,但我不知道怎么做。

我使用以下正则表达式:(branch-[0-9].[0-9])|(master)

4

2 回答 2

1

这是在 Bash 中完成的方式,无需使用外部正则表达式解析器:

# Read reference name path in an array splitting entries by /
IFS=/ read -ra refname < <(
  # Obtain full branch reference path that contains this sha
  git branch --format='%(refname)' --contains="$sha"
)

# Branch name is the last array element
branchname="${refname[-1]}"

printf 'The git branch name for sha: %s\nis: %s\n' "$sha" "$branchname"

或者仅使用 POSIX-shell 语法:

# Read reference path
refname=$(
  # Obtain full branch reference path that contains this sha
  git branch --format='%(refname)' --contains="$sha"
)

# Trim-out all leading path to get only the branch name
branchname="${refname##*/}"

printf 'The git branch name for sha: %s\nis: %s\n' "$sha" "$branchname"

编辑

正如Philippe 提到 --format='%(refname:short)的,将直接返回没有路径的分支名称,从而无需进一步处理以从完整引用路径中提取它。

branchname=$(git branch --format='%(refname:short)' --contains="$sha")
于 2021-11-29T12:47:08.517 回答
1

使用sed

$ branch=$(git branch -a --contains $sha | sed 's#.*/\|[^a-z]*##')

使用awk

$ branch=$(git branch -a --contains $sha | awk -F/ '{gsub("* ","");print $NF}')
于 2021-11-29T12:54:30.697 回答