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

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

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


当前回答

使用——porcelain提供了一个易于解析的向后兼容输出:

Git status——branch——porcelain | grep '##' | cut -c 4-

从文档中可以看到:

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

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

其他回答

下面是我的解决方案,适用于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当前分支和颜色

我在bash文件中使用了这个方法。

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


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

如果您正在使用旧的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

如果你在一个分离的头(即你已经签出了一个版本),并有一个输出从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命令的参数。

如果你正在使用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
            }

```