在Unix或GNU脚本环境(例如Linux发行版、Cygwin、OSX)中,确定当前在工作目录中签出哪个Git分支的最佳方法是什么?

这种技术的一个用途是自动标记版本(就像svnversion对Subversion所做的那样)。

请参阅我的相关问题:如何以编程方式确定Git签出是否是标记,如果是,标记的名称是什么?


当前回答

你可以使用 git name-rev—name-only HEAD

其他回答

我在这里尝试最简单和最不言自明的方法:

git status | grep "On branch" | cut -c 11-

从这个答案:https://stackoverflow.com/a/1418022/605356:

$ git rev-parse --abbrev-ref HEAD
master

显然适用于Git 1.6.3或更新版本。

我是这样做的:

git branch | sed --quiet 's/* \(.*\)/\1/p'

输出如下所示:

$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$

有人觉得让Git描述你所在的分支有什么不对吗?

git rev-parse --symbolic-full-name --abbrev-ref HEAD

它可以在$()中使用,并且可以在Bash、Powershell、Perl等中轻松传递。如果你在提交过程中有几个分支,它不会被愚弄,如果你目前不在一个分支上,它会简单地返回“HEAD”。

或者,您可以使用

git symbolic-ref --short -q HEAD

它会给你相同的输出,但如果你是分离的,它根本不会返回任何东西。如果你想在分离时出现错误,这个选项很有用,只需要删除-q。

试一试:

 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;