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

neu*_*242 44 git bash branch jenkins travis-ci

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

git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Cas*_*bel 42

更多瓷器方式:

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

# or equivalently:
git show -s --pretty=%d HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

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

有利于将候选人引用在单独的行上,没有额外的字符.

  • 您可以使用--pretty =%D获取没有周围括号的`HEAD,branchname`。在git v2.11.0上测试 (6认同)
  • `git show -s --pretty=%D HEAD | tr -s ', ' '\n' | grep -v 头 | 头-n1` (2认同)

Epe*_*eli 28

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

git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3
Run Code Online (Sandbox Code Playgroud)

或没有网络:

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

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

更新:

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

echo $GIT_BRANCH | cut -d / -f 2
Run Code Online (Sandbox Code Playgroud)


Set*_*son 9

git branch --contains HEAD
Run Code Online (Sandbox Code Playgroud)

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

  • 不起作用,它只是说"*(没有分支)" (3认同)

ing*_*ere 5

一个sed办法:

git log -1 --pretty=%D HEAD | sed 's/.*origin\///g;s/, .*//g'
Run Code Online (Sandbox Code Playgroud)

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

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