这个问题已经在这里有一个答案:
- 如何获得Git中当前分支的名字吗? 35个回答
在UNIX或GNU脚本环境(例如,一个Linux发行版,Cygwin的,OSX),什么是确定的Git分支的工作目录是当前已签出的最佳方式?
一个使用此技术将自动标记释放(如svnversion
将做使用Subversion)。
也请参阅我的相关问题: 如何以编程方式确定一个Git结账是否是一个标签,如果有什么是标签的名字吗?
这个问题已经在这里有一个答案:
在UNIX或GNU脚本环境(例如,一个Linux发行版,Cygwin的,OSX),什么是确定的Git分支的工作目录是当前已签出的最佳方式?
一个使用此技术将自动标记释放(如svnversion
将做使用Subversion)。
也请参阅我的相关问题: 如何以编程方式确定一个Git结账是否是一个标签,如果有什么是标签的名字吗?
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.
有谁看到什么毛病只是要求的Git来形容你的分支?
git rev-parse --symbolic-full-name --abbrev-ref HEAD
可以$内使用()和Bash中,PowerShell中,Perl等容易通过,如果你对提交你在几个分支它是不是上当了,如果你现在不在一个分支,它只是与“HEAD”的答复。
另外,您也可以使用
git symbolic-ref --short -q HEAD
这将给你相同的输出,但它不会在所有的,如果你被分离返回任何东西。 如果你什么时候脱落,虽然,只是删除-q希望有一个错误这是一个很有用。
你可以使用git name-rev --name-only HEAD
从这样的回答: https://stackoverflow.com/a/1418022/605356 :
$ git rev-parse --abbrev-ref HEAD
master
使用Git 1.6.3或更高版本显然作品。
试着用:
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;
适应接受的答案的Windows PowerShell:
Split-Path -Leaf (git symbolic-ref HEAD)
在bash的文件这一个为我工作。
git branch | grep '^*' | sed 's/* //'
################bash file###################
#!/bin/bash
BRANCH=$(git branch | grep '^*' | sed 's/* //' )
echo $BRANCH
这一次对我的作品。 该--no-color
部分,或者如果你想有一个简单的字符串返回即可,非常重要。
git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
我想在这里最简单,最不言自明的方法:
git status | grep "On branch" | cut -c 11-
这是我做的:
git branch | sed --quiet 's/* \(.*\)/\1/p'
输出应该是这样的:
$ git branch | sed --quiet 's/* \(.*\)/\1/p'
master
$
我发现了两个非常简单的方法来做到这一点:
$ git status | head -1 | cut -d ' ' -f 4
和
$ git branch | grep "*" | cut -d ' ' -f 2
有人提到少于三个任务做在bash ......这个怎么样有些凌乱的控制流程:
branch_name="$(b=$(git symbolic-ref -q HEAD); { [ -n "$b" ] && echo ${b##refs/heads/}; } || echo HEAD)"
如果您使用的是旧版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
这里是我的解决方案,适用于一个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线
使用 - 陶瓷给人以向后兼容的输出易于解析:
git status --branch --porcelain | grep '##' | cut -c 4-
从文档:
瓷格式类似于短格式,但保证不会在根据用户的配置版本的Git或之间的向后兼容的方式改变。 这使得它非常适合通过脚本解析。
https://git-scm.com/docs/git-status
如果您使用的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
}
```
相同的结果,在单行变量赋值接受的答案:
branch_name=$((git symbolic-ref HEAD 2>/dev/null || echo "(unnamed branch)")|cut -d/ -f3-)
这是一个解决方案。 如果你把它添加到你的.bashrc,它会显示在控制台当前分支。
# git branch
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
$PS1="\$(parse_git_branch)$PS1"
但是它是相当有限的。 但是有一个很大的项目叫混帐SH ,这是做正是(和更多)。
我发现,调用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@/[^/]*$@@;
}
可能需要一些调整。
如果你是一个分离的头(即你已经签出一个版本),并有从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命令。