如何获取Git中当前分支的名称?


当前回答

我一直在与CircleCI和git标签斗争,这就是我最终的结果:

if [[ -n $(git branch --show-current) ]]; then
    git branch --show-current
else
    git branch -a --contains $(git rev-parse --short HEAD) \
    | sed '/HEAD/d' \
    | sed 's/remotes\/origin\///g' \
    | sed 's/\*//g' | sed 's/ *//g' \
    | awk '!_[$0]++'
fi

虽然有点难看,但确实如此

常规提交的工作:它只使用git的--show current标志,如果有效,我们就不需要再多看了;本地和CI容器上标记的工作:当头部分离时,它将获得远程分支名称。

注意事项:

只要标记的提交只出现在一个分支上,这就可以正常工作。因此,如果您通常合并到dev,并从那里通过转移到生产,那么来自dev的原始提交将出现在所有三个分支上,从而破坏代码。但只要您只标记合并/PR提交这需要预先运行git fetch-a,因为CI只会检出默认的分支和标记的提交,所以如果正确的分支都不是,它将无法工作

更多解释:

我想获得分支名称,即使CI构建是由标记触发的。在这种情况下,没有设置CircleCI pipeline.git.branch变量,也无法在头部分离时从git中轻松获取分支名称(正如许多其他问题中所指出的)。这意味着grepping当前分支(使用*前缀)也不能像在CI上那样工作,当前分支将是分离的头部分支。其想法是获取包含此提交的所有分支(包括远程分支);然后删除分离的head结果,去掉所有不是实际分支名称的位并消除重复

其他回答

要仅显示当前分支的名称,请执行以下操作:

git rev-parse --abbrev-ref HEAD

参考:仅显示Git中的当前分支

git log

此命令将在顶部显示当前分支名称的提交列表。

如果CI服务器没有带有分支名称的环境变量,并且容器内部没有git二进制文件,则可以使用:

cat.git/HEAD|awk-F'/'“{print$NF}”

使用早期的想法;假设sha1为40个字符;和跟踪引用(是的,应该删除调试打印行:-):

git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
  from=$(NF - 2)
  to=$NF
  print from, to, length(from) > "/dev/stderr"
  if (length(from) != 40) { print from ; exit; }
  sha=substr(from, 1, 7)
  print sha > "/dev/stderr"
}
'

给出原始输出:

$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master

使用Mac将其添加到PS1:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

在运行上述命令之前:

运行该命令后:

不要担心,如果它不是GIT存储库,它不会显示错误,因为[-d.GIT]会检查.GIT文件夹是否存在。