bash-如何在分离的HEAD中找到当前的git分支

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

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

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

我当前的工作解决方案是这样的:

git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD

它显示在HEAD提示中具有最后提交的任何分支名称。 这可以正常工作,但我认为使用git-fu更强的人可能有更好的解决方案?

neu242 asked 2020-08-01T15:25:50Z
5个解决方案
40 votes

更瓷器的方式:

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

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

裁判将以(HEAD, master)的格式列出-如果您打算在脚本中而不是供人类使用,则必须对其进行一些解析。

您还可以自己更干净地实现它:

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

这样做的好处是可以将候选引用放在单独的行中,而无需多余的字符。

Cascabel answered 2020-08-01T15:26:18Z
27 votes

对于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
Epeli answered 2020-08-01T15:26:56Z
9 votes
git branch --contains HEAD

显然丢弃(无分支)。 当然,您可能会获得任意数量的分支,可以描述当前的HEAD(当然,取决于您进入无分支的方式,当然也没有),这些分支可能已被快速合并到本地分支中(许多很好的原因之一) 为什么您应该始终使用git merge --no-ff)。

Seth Robertson answered 2020-08-01T15:27:17Z
1 votes

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

Gaelan answered 2020-08-01T15:27:37Z
1 votes

这是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
jthill answered 2020-08-01T15:28:01Z
translate from https://stackoverflow.com:/questions/6059336/how-to-find-the-current-git-branch-in-detached-head-state