如何在分离的HEAD状态下找到当前的git分支

时间:2011-05-19 13:22:17

标签: git bash jenkins branch travis-ci

我可以通过执行以下任一操作找到当前的git分支名称:

git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD

但是当处于分离的HEAD状态时,例如在Jenkins maven构建中的后构建阶段(或在Travis git fetch中),这些命令不起作用。

我目前的工作解决方案是:

git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq

它显示在其HEAD提示上具有最后一次提交的任何分支名称。这样做很好,但我觉得有一个更强大的git-fu的人可能会有一个更漂亮的解决方案吗?

9 个答案:

答案 0 :(得分:31)

更多的瓷器方式:

git log -n 1 --pretty=%d HEAD

# or equivalently:
git show -s --pretty=%d HEAD

refs将以(HEAD, master)格式列出 - 如果您打算在脚本中使用它而不是供人类使用,则必须稍微解析它。

你也可以自己更干净地实现它:

git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}"

有利于将候选引文分开,没有多余的字符。

答案 1 :(得分:24)

我需要一个与Jenkins不同的解决方案,因为它没有分支的本地副本。因此,当前提交必须与远程分支匹配:

git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3

或没有网络:

git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p'

还值得注意的是,当您在同一次提交中有多个分支头时,这可能会返回多个分支名称。

更新:

我刚注意到Jenkins设置GIT_BRANCH环境变量,其中包含origin/master之类的值。这也可以用来在Jenksin中获取git分支:

echo $GIT_BRANCH | cut -d / -f 2

答案 2 :(得分:8)

git branch --contains HEAD

显然丢弃(没有分支)。当然,您可以获得任意数量的分支,这些分支可以描述当前的HEAD(当然包括没有取决于您如何进入无分支),这些分支可能已快速合并到本地分支中(许多充分理由之一)为什么你应该总是使用git merge --no-ff)。

答案 3 :(得分:3)

如果您在分支机构,则

git symbolic-ref HEAD会返回refs/heads/branchname,如果您不在,则返回错误。

答案 4 :(得分:1)

在这里git nthlastcheckout,它会从reflog中获取您用于第n次上次结帐的确切字符串:

git config --global alias.nthlastcheckout '!nthlastcheckout'"() {
        git reflog |
        awk '\$3==\"checkout:\" {++n}
             n=='\${1-1}' {print \$NF; exit}
             END {exit n!='\${1-1}'}'
}; nthlastcheckout \"\$@\""

示例:

$ git nthlastcheckout
master
$ git nthlastcheckout 2
v1.3.0^2

答案 5 :(得分:1)

我在Bitbucket管道上工作的最短时间:

git show -s --pretty=%D HEAD | awk '{gsub("origin/", ""); print $2}'

答案 6 :(得分:0)

现在使用Git 2.23(2019年第三季度)应该更简单,因为“ git branch --list”学会了始终将分离的HEAD作为第一项输出(分离HEAD时,课程),而不论语言环境如何。
(它来自addition of showing checked out branches

然后您可以将此条目与git branch --show-currentGit 2.22)进行比较

请参见commit 28438e8Matthew DeVore (matvore)(2019年6月18日)。
帮助者:Johannes Schindelin (dscho)Jonathan Nieder (artagnon)
(由Junio C Hamano -- gitster --commit 92f66fd中合并,2019年7月9日)

  

ref-filter:首先对分离的HEAD行进行排序

     

在此补丁程序之前,“ git branch”将在大多数情况下将“ (HEAD detached...)”和“ (no branch, rebasing...)”行放在所有其他分支之前   情况(使用中文消息时除外)。
  zh_CN通常使用全角“ (”符号(代码点FF08)来匹配汉字的全角比例,而我们翻译过的字符串   使用它们。 这意味着分离的HEAD行毕竟会出现   本地参考,甚至在远程参考之后也要

     

AFAIK,有时候像在CJK语言中那样,在“全角”文本中看到半角括号并不令人不快,例如,当在带括号的文本片段之前或之后没有字符时。
  通过从可本地化的文本中删除括号,我们可以共享字符串   wt-status.c中删除对翻译人员的警告。

     

从邮件的可本地化部分中删除(,因此无论使用哪种语言环境,排序都可以正确进行。

答案 7 :(得分:0)

一种sed解决方案:

git log -1 --pretty=%D HEAD | sed 's/.*origin\///g;s/, .*//g'

这使用log检查最后一项是否存在于分支中。然后sed找到以origin/开头的分支,并删除该短语及其之前的所有内容。然后sed再次删除所有可能列出的其他分支(逗号及其后的所有内容)。最后一个log的原因被用作健全性检查,以确保该分离的HEAD不是高于已知分支HEAD的提交。

如果该字段为空,则可以实施故障安全逻辑以将分支标记为“分离”(或“未定义”?),或确保该分支是最新的或回滚到已知HEAD的尖端。

答案 8 :(得分:0)

我更喜欢用这个:

git branch --remote --contains | sed "s|[[:space:]]*origin/||"

如果分支的头部被签出,以及当前签出是一个分离的头部并且不需要网络访问时,它工作正常。