在 Unix 或 GNU 脚本环境中(例如 Linux 发行版、Cygwin 和 OSX),如何最好地确定当前正在工作目录中检出的 Git 分支?
这种技术的一个用途是自动标记发布(就像 svnversion
在 Subversion 中所做的那样)。
请参见我的相关问题:如何程序化地确定 Git 检出是否为标签,如果是,则标签名称是什么?
在 Unix 或 GNU 脚本环境中(例如 Linux 发行版、Cygwin 和 OSX),如何最好地确定当前正在工作目录中检出的 Git 分支?
这种技术的一个用途是自动标记发布(就像 svnversion
在 Subversion 中所做的那样)。
请参见我的相关问题:如何程序化地确定 Git 检出是否为标签,如果是,则标签名称是什么?
正确的解决方案是查看contrib/completions/git-completion.bash,这个文件为bash提示符中的__git_ps1
提供了支持。移除所有额外的部分,如选择如何描述分离头指针情况(例如,当我们处于未命名分支上时),它是:
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
git symbolic-ref用于从符号引用中提取完全限定的分支名称,我们用它来获取当前检出的分支HEAD。
另一种解决方案可能是:
branch_name=$(git symbolic-ref -q HEAD)
branch_name=${branch_name##refs/heads/}
branch_name=${branch_name:-HEAD}
在最后一行中,我们处理了分离的HEAD情况,仅使用“HEAD”来表示这种情况。
添加于11-06-2013
Junio C. Hamano(git维护者)在2013年6月10日的博客文章“程序化检查当前分支”更详细地解释了为什么(以及如何)。
cat .git/refs/heads/branch
,改用git rev-parse --verify refs/heads/branch
。引用可以被打包,使用cat
的解决方法会失败。 - Jakub Narębskigit symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3
请注意,不要改变原始含义。 - KiRPiCHgit symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3-
这就是你想要的。 :) - shazowgit-symbolic-ref
命令时指定 --short
选项,这样输出中的 refs/heads
将被移除。 - CharlesB有人觉得直接询问Git当前所在的分支有什么问题吗?
git rev-parse --symbolic-full-name --abbrev-ref HEAD
这可以在$()中使用,并且可以轻松地在Bash、Powershell、Perl等中传递。如果您有多个分支在提交时,它不会被欺骗;如果您当前没有分支,则仅回复“HEAD”。
或者,您可以使用
git symbolic-ref --short -q HEAD
如果你处于分离状态,以下代码会产生相同的输出,但不会返回任何内容。如果你想要在分离状态下出错,只需删除“-q”即可。
将会给你相同的输出,但是如果你处于分离状态,它将不会返回任何内容。如果你想在分离状态下得到一个错误,只需删除“-q”即可。
git rev-parse --symbolic-full-name --abbrev-ref HEAD
放入Bash的PS1变量或Csh的提示符中? - boltup_im_codingfunction Git-GetCurrentBranch() {
return (&$git rev-parse --symbolic-full-name --abbrev-ref HEAD)
}
其中$git是我的Git.exe路径。 - Michael Erickson--symbolic-full-name
参数? - Knu你可以使用git name-rev --name-only HEAD
来自这个答案:https://dev59.com/SXM_5IYBdhLWcg3wWRoF#1418022:
$ git rev-parse --abbrev-ref HEAD
master
显然适用于Git 1.6.3或更新版本。
尝试使用:
git symbolic-ref --short -q HEAD
或者你可以尝试使用git branch
命令,并使用--no-color
选项来强制输出简单的纯文本字符串:
git branch --no-color
使用grep的正则表达式模式(-E
),您可以检查字符'*'是否存在:
git branch --no-color | grep -E '^\*'
结果类似于:
* currentBranch
您可以使用以下选项:
sed 's/\*[^a-z]*//g'
cut -d ' ' -f 2
awk '{print $2}'
例如:
git branch --no-color | grep -E '^\*' | sed 's/\*[^a-z]*//g'
git branch --no-color | grep -E '^\*' | sed cut -d ' ' -f 2
git branch --no-color | grep -E '^\*' | awk '{print $2}'
如果存在错误,您将无法使用默认值:
cmd || echo 'defualt value';
将所有代码放进一个 Bash 函数中:
function get_branch() {
git branch --no-color | grep -E '^\*' | awk '{print $2}' \
|| echo "default_value"
# or
# git symbolic-ref --short -q HEAD || echo "default_value";
}
branch_name=`get_branch`;
echo $branch_name;
这个在我的bash文件中运行成功。
git branch | grep '^*' | sed 's/* //'
################bash file###################
#!/bin/bash
BRANCH=$(git branch | grep '^*' | sed 's/* //' )
echo $BRANCH
将被接受的答案调整为 Windows PowerShell:
Split-Path -Leaf (git symbolic-ref HEAD)
这是我的工作内容:
git branch | sed --quiet 's/* \(.*\)/\1/p'
$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
git branch | sed -n "/\*/ s/.* // p"
- the.malkolm--no-color
部分是或者可以成为重要的因素。git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
git branch | cat
。 - Thorgit config color.branch
值... - mgalgsgit status --branch --porcelain | grep '##' | cut -c 4-
根据文档说明:
porcelain 格式类似于 short 格式,但是保证不会因为 Git 版本或用户配置的变化而导致不向后兼容。这使得它非常适合用于脚本解析。master...origin/master
。 - gowthz
git branch --show-current
。请参考我的这个回答。 - VonC--no-color
将会给出更适合脚本的结果git branch --no-color --show-current
。 - Paulo Amaral