shell下如何获取git的当前所在分支名或tag呢?
为了解决这个小问题,我之前是走了弯路的,之前我简单的想法就是解析git branch
输出的内容从中获取 分支或tag名。
如下代码,
# 返回$1指定的git项目的当前分支(branch)或标签名(tag)
# $1 git项目源码位置
function current_branch(){
git -C $1 branch | grep '*' | sed -e 's/\*//g' -e 's/HEAD detached at//g' -e 's/\s*//g' -e 's/[\(\)]//g'
}
但是我一直觉得这个办法不靠谱。对于普通的分支名(such as master),这个办法是没啥问题,但当切换到某个tag时。git branch
的输出是这样的:
$ git branch
- (HEAD detached at facelog-2.4.1)
dev2
master
上面的方法就是把输出字符串(HEAD detached at facelog-2.4.1)
中无用的信息(HEAD,detached,at)都清理掉。现在用着也没问题,但保不齐哪天git版本升级,输出的单词改了一点,这个办法就不管用了。
今天认真在google上找了一下这个问题的解决办法,在 stackoverflow上找到这个帖子:
https://stackoverflow.com/questions/6245570/how-to-get-the-current-branch-name-in-git
嗯,挺对症的。在大神们提出了N种办法中找到下面这个,分支名,tag名,commit id都考虑到了,很完善,
于是基于这个方法我写了自己的函数,经测试没问题
# 返回$1指定的git项目的当前分支(branch)或标签名(tag)
# $1 git项目源码位置,为空获则默认为当前文件夹
function current_branch () {
local folder="$(pwd)"
[ -n "$1" ] && folder="$1"
git -C "$folder" rev-parse --abbrev-ref HEAD | grep -v HEAD || \
git -C "$folder" describe --tags HEAD || \
git -C "$folder" rev-parse HEAD
}
$ function current_branch () {
> local folder="$(pwd)"
> [ -n "$1" ] && folder="$1"
> git -C "$folder" rev-parse --abbrev-ref HEAD | grep -v HEAD || \
> git -C "$folder" describe --tags HEAD || \
> git -C "$folder" rev-parse HEAD
> }
$ current_branch .
facelog-2.4.1
$ current_branch /j/fdevmgrWhse
master