60

我可以通过执行以下任一操作找到当前的 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 更强大的人可能有更漂亮的解决方案?

4

7 回答 7

53

更瓷器的方式:

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}"

好处是在不同的行上获得候选参考,没有额外的字符。

于 2011-05-19T20:02:58.427 回答
38

我需要为 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
于 2013-10-18T18:59:54.040 回答
12
git branch --contains HEAD

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

于 2011-05-20T02:02:37.853 回答
3

一个sed解决方案:

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

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

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

于 2020-06-07T00:36:06.907 回答
1

在这里git nthlastcheckout,它会从 reflog 中获取您在最后一次结帐时使用的确切字符串:

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
于 2015-02-07T01:20:55.080 回答
1

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

git show -s --pretty=%D HEAD | awk '{gsub("origin/", ""); print $2}'
于 2019-11-13T08:31:37.823 回答
1

我更喜欢使用这个:

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

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

于 2021-05-21T13:45:25.770 回答