我可以通过执行以下任一操作找到当前的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的人可能会有一个更漂亮的解决方案吗?
答案 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-current
(Git 2.22)进行比较
请参见commit 28438e8的Matthew 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/||"
如果分支的头部被签出,以及当前签出是一个分离的头部并且不需要网络访问时,它工作正常。