如何以编程方式确定当前已签出的Git分支[复制](How to programmatically d

2019-08-21 09:30发布

这个问题已经在这里有一个答案:

  • 如何获得Git中当前分支的名字吗? 35个回答

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

一个使用此技术将自动标记释放(如svnversion将做使用Subversion)。

也请参阅我的相关问题: 如何以编程方式确定一个Git结账是否是一个标签,如果有什么是标签的名字吗?

Answer 1:

The correct solution is to take a peek at contrib/completions/git-completion.bash does that for bash prompt in __git_ps1. Removing all extras like selecting how to describe detached HEAD situation, i.e. when we are on unnamed branch, it is:

branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)"     # detached HEAD

branch_name=${branch_name##refs/heads/}

git symbolic-ref is used to extract fully qualified branch name from symbolic reference; we use it for HEAD, which is currently checked out branch.

Alternate solution could be:

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

where in last line we deal with the detached HEAD situation, using simply "HEAD" to denote such situation.


Added 11-06-2013

Junio C. Hamano (git maintainer) blog post, Checking the current branch programatically, from June 10, 2013 explains whys (and hows) in more detail.



Answer 2:

有谁看到什么毛病只是要求的Git来形容你的分支?

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

可以$内使用()和Bash中,PowerShell中,Perl等容易通过,如果你对提交你在几个分支它是不是上当了,如果你现在不在一个分支,它只是与“HEAD”的答复。

另外,您也可以使用

git symbolic-ref --short -q HEAD

这将给你相同的输出,但它不会在所有的,如果你被分离返回任何东西。 如果你什么时候脱落,虽然,只是删除-q希望有一个错误这是一个很有用。



Answer 3:

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



Answer 4:

从这样的回答: https://stackoverflow.com/a/1418022/605356 :

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

使用Git 1.6.3或更高版本显然作品。



Answer 5:

试着用:

 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;


Answer 6:

适应接受的答案的Windows PowerShell:

Split-Path -Leaf (git symbolic-ref HEAD)


Answer 7:

在bash的文件这一个为我工作。

git branch | grep '^*' | sed 's/* //'  


################bash file###################
#!/bin/bash
BRANCH=$(git branch | grep '^*' | sed 's/* //' )
echo $BRANCH


Answer 8:

这一次对我的作品。 该--no-color部分,或者如果你想有一个简单的字符串返回即可,非常重要。

git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'


Answer 9:

我想在这里最简单,最不言自明的方法:

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


Answer 10:

这是我做的:

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

输出应该是这样的:

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


Answer 11:

我发现了两个非常简单的方法来做到这一点:

$ git status | head -1 | cut -d ' ' -f 4

$ git branch | grep "*" | cut -d ' ' -f 2


Answer 12:

有人提到少于三个任务做在bash ......这个怎么样有些凌乱的控制流程:

branch_name="$(b=$(git symbolic-ref -q HEAD); { [ -n "$b" ] && echo ${b##refs/heads/}; } || echo HEAD)"


Answer 13:

如果您使用的是旧版NT命令行,你可以使用以下命令:

@for /f "usebackq" %i in (`git symbolic-ref -q HEAD`) do @echo %~ni

要在批处理文件中使用,你就必须加倍%的:

@for /f "usebackq" %%i in (`git symbolic-ref -q HEAD`) do @echo %%~ni


Answer 14:

这里是我的解决方案,适用于一个PS1,或用于自动标记释放

如果你在一个分支签出,你得到的分支名。

如果你是在一个公正的init'd 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另一个功能,您可以在这里充分查看: 用git当前分支和颜色PS1线



Answer 15:

使用 - 陶瓷给人以向后兼容的输出易于解析:

git status --branch --porcelain | grep '##' | cut -c 4-

从文档:

瓷格式类似于短格式,但保证不会在根据用户的配置版本的Git或之间的向后兼容的方式改变。 这使得它非常适合通过脚本解析。

https://git-scm.com/docs/git-status



Answer 16:

如果您使用的gradle产出,

```

def gitHash = new ByteArrayOutputStream()    
project.exec {
                commandLine 'git', 'rev-parse', '--short', 'HEAD'
                standardOutput = gitHash
            }

def gitBranch = new ByteArrayOutputStream()   
project.exec {
                def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
                commandLine "bash", "-c", "${gitCmd}"
                standardOutput = gitBranch
            }

```



Answer 17:

相同的结果,在单行变量赋值接受的答案:

branch_name=$((git symbolic-ref HEAD 2>/dev/null || echo "(unnamed branch)")|cut -d/ -f3-)


Answer 18:

这是一个解决方案。 如果你把它添加到你的.bashrc,它会显示在控制台当前分支。

# git branch
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
$PS1="\$(parse_git_branch)$PS1"

但是它是相当有限的。 但是有一个很大的项目叫混帐SH ,这是做正是(和更多)。



Answer 19:

我发现,调用Git是(任子的),尤其是用于更新提示相当缓慢。 时间变化的回购的根目录内0.1和0.2秒之间,并用0.2秒的回购外面,顶部槽口机(RAID 1,8 GB的RAM,8个硬件线程)上。 它运行的Cygwin,虽然。

因此,我写这个剧本的速度:

#!/usr/bin/perl

$cwd=$ENV{PWD}; #`pwd`;
chomp $cwd;

while (length $cwd)
{
        -d "$cwd/.git" and do {
                -f "$cwd/.git/HEAD" and do {
                        open IN, "<", "$cwd/.git/HEAD";
                        $_=<IN>;
                        close IN;
                        s@ref: refs/heads/@@;
                        print $_;
                };
                exit;
        };

        $cwd=~s@/[^/]*$@@;
}

可能需要一些调整。



Answer 20:

如果你是一个分离的头(即你已经签出一个版本),并有从git的状态的输出如

HEAD detached at v1.7.3.1

你想要的发行版,我们用下面的命令......

git status --branch | head -n1 | tr -d 'A-Za-z: '

这将返回1.7.3.1,这是我们在parameters.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命令。



文章来源: How to programmatically determine the current checked out Git branch [duplicate]
标签: git bash shell