在Unix或GNU脚本环境(例如Linux发行版、Cygwin、OSX)中,确定当前在工作目录中签出哪个Git分支的最佳方法是什么?
这种技术的一个用途是自动标记版本(就像svnversion对Subversion所做的那样)。
请参阅我的相关问题:如何以编程方式确定Git签出是否是标记,如果是,标记的名称是什么?
在Unix或GNU脚本环境(例如Linux发行版、Cygwin、OSX)中,确定当前在工作目录中签出哪个Git分支的最佳方法是什么?
这种技术的一个用途是自动标记版本(就像svnversion对Subversion所做的那样)。
请参阅我的相关问题:如何以编程方式确定Git签出是否是标记,如果是,标记的名称是什么?
当前回答
试一试:
git symbolic-ref --short -q HEAD
或者你试着用git分支——no-color force简单的纯字符串输出:
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";
}
Use:
branch_name=`get_branch`;
echo $branch_name;
其他回答
使用——porcelain提供了一个易于解析的向后兼容输出:
Git status——branch——porcelain | grep '##' | cut -c 4-
从文档中可以看到:
瓷格式类似于短格式,但保证不会在Git版本之间或基于用户配置以向后不兼容的方式更改。这使得它非常适合通过脚本进行解析。
https://git-scm.com/docs/git-status
我是这样做的:
git branch | sed --quiet 's/* \(.*\)/\1/p'
输出如下所示:
$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
试一试:
git symbolic-ref --short -q HEAD
或者你试着用git分支——no-color force简单的纯字符串输出:
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";
}
Use:
branch_name=`get_branch`;
echo $branch_name;
下面是我的解决方案,适用于PS1,或者自动标记一个版本
如果您在分支签出,您将得到分支名称。
如果你在一个刚初始化的git项目中,你只需要使用@
如果你是无头的,你会得到一个相对于某个分支或标签的漂亮的人的名字,在名字之前有一个“@”。
如果你是无头的,并且不是某个分支或标签的祖先,你只会得到短的SHA1。
function we_are_in_git_work_tree {
git rev-parse --is-inside-work-tree &> /dev/null
}
function parse_git_branch {
if we_are_in_git_work_tree
then
local BR=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD 2> /dev/null)
if [ "$BR" == HEAD ]
then
local NM=$(git name-rev --name-only HEAD 2> /dev/null)
if [ "$NM" != undefined ]
then echo -n "@$NM"
else git rev-parse --short HEAD 2> /dev/null
fi
else
echo -n $BR
fi
fi
}
如果您愿意,可以删除if we_are_in_git_work_tree位;我只是在我的PS1的另一个函数中使用它,你可以在这里完整地查看:PS1行git当前分支和颜色
有人觉得让Git描述你所在的分支有什么不对吗?
git rev-parse --symbolic-full-name --abbrev-ref HEAD
它可以在$()中使用,并且可以在Bash、Powershell、Perl等中轻松传递。如果你在提交过程中有几个分支,它不会被愚弄,如果你目前不在一个分支上,它会简单地返回“HEAD”。
或者,您可以使用
git symbolic-ref --short -q HEAD
它会给你相同的输出,但如果你是分离的,它根本不会返回任何东西。如果你想在分离时出现错误,这个选项很有用,只需要删除-q。