如何在Git中获取当前分支的名称?
git branch|grep "*"
输出:
* <current branch>
编辑:
知道当前分支的另一种方法
git status|head -1
On branch <current branch name>
git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
更新:如果您有awk工具并且不害怕使用它,那么这个方法会更加方便。
git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
rev | cut -d' ' -f1| rev
可以简化为 awk '{print $NF}'
。 - Steve Buzonasgit reflog | awk '$3=="checkout:" {print $NF; exit}'
- jthillgit status | sed -n 1p
解释:
git status -> 获取工作目录状态
sed -n 1p -> 从状态内容中获取第一行
对于以上命令的响应结果将会如下所示:
"On branch your_branch_name"
head -1
是通常的方式。 - bukzor使用 git branch --contains HEAD | tail -1 | xargs
命令,它也适用于“分离的 HEAD”状态。
我想要一行代码,可以在Windows CMD shell中解析(这里的大多数答案使用unix命令)。大多数答案也存在稀疏检出和分离头的问题。
git branch
列出工作副本中可用的分支列表,其中选中的分支前面带有*号。这对于快速查看很有用,但不适合解析。
git rev-parse --abbrev-ref HEAD
当在分离的 HEAD 检出上使用时,只显示HEAD作为分支。同样地,当使用时
git symbolic-ref HEAD
当我使用一个来自标签的分离头时,出现了致命错误:ref HEAD不是符号引用。
git describe --contains --all HEAD
看起来大部分时间都能工作,并且接近我想要的,但是对于一些仓库只返回了一个空行。
git status
这段代码可以正常工作,但它会列出仓库中的所有差异,这使得解析变得有点困难。
最终我选择了以下代码;
git status |findstr/n ^^|findstr "^[1]: ^[0]:"
或者1:HEAD分离于2.30.20
1:在主分支上
如果你的CI服务器没有分支名称的环境变量,并且你使用的是不带有容器内部的git
二进制文件的docker化构建,那么可以使用以下命令:
cat .git/HEAD | awk -F '/' '{print $NF}'
.git/HEAD
只包含相应提交的SHA。 - Matt Cleggcat
是多余的。只需执行awk -F '/' '{print $NF}' $PATH/to/.git/HEAD
即可。 - Jimfeature/foo
,那么它也会失败,因为你只会得到 foo
。 - Troy Daniels我一直在与 CircleCI 和 git 标签进行抗争,最终得出了以下结果:
if [[ -n $(git branch --show-current) ]]; then
git branch --show-current
else
git branch -a --contains $(git rev-parse --short HEAD) \
| sed '/HEAD/d' \
| sed 's/remotes\/origin\///g' \
| sed 's/\*//g' | sed 's/ *//g' \
| awk '!_[$0]++'
fi
虽然有点丑陋,但是它可以:
--show-current
标志,如果这个标志起作用,我们就不需要再往下看了;在本地和CI容器上都适用。注意事项:
dev
合并到staging
然后通过production
,则原始提交将出现在所有三个分支上,从而破坏此代码。但只要您仅针对合并/PR提交打标签,它便可行。git fetch -a
,因为CI只会检出默认分支和标记的提交,所以如果正确的分支不是这些分支之一,则无法工作。更多解释:
pipeline.git.branch
变量未设置,也不能轻松地从git中获取分支名,因为HEAD被分离了(正如其他许多问题所指出的那样)。这意味着使用*
前缀grep当前分支(在CI中,当前分支将是分离的头部)也不起作用。如果当前在分支上,只需打印分支的名称;但如果是脱离状态,则打印当前提交的ID:
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD
.git/HEAD
,可能位于父目录中。 - Tino