如何以编程方式确定当前签出的Git分支?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (267)

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

这种技术的一种用法是自动标记发布版本(如svnversion将使用Subversion)。

提问于
用户回答回答于

正确的解决方案是在contrib / completions / git-completion.bash中查看__git_ps1中的bash提示符。 除去选择如何描述分离HEAD情况的所有附加功能,即当我们在未命名的分支上时,它是:

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,该HEAD目前已被检出分支。

备用解决方案可以是:

branch_name=$(git symbolic-ref -q HEAD)
branch_name=${branch_name##refs/heads/}
branch_name=${branch_name:-HEAD}

在最后一行,我们处理分离的头部情况,简单地使用“Head”来表示这种情况。

用户回答回答于
用户回答回答于

以下是我所做的工作:

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

输出

$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
用户回答回答于
git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
用户回答回答于

这个在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 symbolic-ref --short -q HEAD

或者你试着git branch带着--no-color强制简单的普通字符串输出:

 git branch  --no-color

在regex模式下使用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;
用户回答回答于
用户回答回答于
用户回答回答于
git rev-parse --symbolic-full-name --abbrev-ref HEAD

这可以在$()中使用,并且可以在Bash,Powershell,Perl等中轻松传递。如果在提交时有多个分支,并且如果当前不在分支上,它就会简单 回复“HEAD”。

或者,可以使用

git symbolic-ref --short -q HEAD

这会给你相同的输出,但是如果你被分离,它将不会返回任何东西。 如果想要在分离时发生错误,只需删除-q即可。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动