在Unix或GNU脚本环境(例如Linux发行版、Cygwin、OSX)中,确定当前在工作目录中签出哪个Git分支的最佳方法是什么?
这种技术的一个用途是自动标记版本(就像svnversion对Subversion所做的那样)。
请参阅我的相关问题:如何以编程方式确定Git签出是否是标记,如果是,标记的名称是什么?
在Unix或GNU脚本环境(例如Linux发行版、Cygwin、OSX)中,确定当前在工作目录中签出哪个Git分支的最佳方法是什么?
这种技术的一个用途是自动标记版本(就像svnversion对Subversion所做的那样)。
请参阅我的相关问题:如何以编程方式确定Git签出是否是标记,如果是,标记的名称是什么?
当前回答
有人提到在bash中做不到三个任务…像这样混乱的控制流怎么样:
branch_name="$(b=$(git symbolic-ref -q HEAD); { [ -n "$b" ] && echo ${b##refs/heads/}; } || echo HEAD)"
其他回答
我是这样做的:
git branch | sed --quiet 's/* \(.*\)/\1/p'
输出如下所示:
$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
这是一个解。如果您将它添加到.bashrc中,它将在控制台中显示当前分支。
# git branch
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
$PS1="\$(parse_git_branch)$PS1"
然而,这是相当有限的。但是有一个叫做git sh的伟大项目,它正在做这些事情(甚至更多)。
如果你在一个分离的头(即你已经签出了一个版本),并有一个输出从git状态,如
HEAD detached at v1.7.3.1
你想要发布版本,我们使用下面的命令…
git status --branch | head -n1 | tr -d 'A-Za-z: '
这将返回1.7.3.1,我们在参数中替换它。yml (Symfony)与
# RevNum=`svn status -u | grep revision | tr -d 'A-Za-z: '` # the old SVN version
RevNum=`git status --branch | head -n1 | tr -d 'A-Za-z: '` # Git (obvs)
sed -i "/^ app_version:/c\ app_version:$RevNum" app/config/parameters.yml
显然,如果你的分支名称中有非数字,你需要改变tr命令的参数。
结果与单行变量赋值中接受的答案相同:
branch_name=$((git symbolic-ref HEAD 2>/dev/null || echo "(unnamed branch)")|cut -d/ -f3-)
试一试:
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;