如何获得当前git分支的名字到一个shell脚本中的variables?

我是新的shell脚本,并不能解决这个问题。 如果你不熟悉,命令git分支返回类似

* develop master 

,星号标记当前签出的分支。 当我在terminal中运行以下内容时:

 git branch | grep "*" 

我得到:

 * develop 

如预期。

但是,当我跑步

 test=$(git branch | grep "*") 

要么

 test=`git branch | grep "*"` 

接着

 echo $test 

,结果只是目录中的文件列表。 我们如何使test =“* develop”的价值?

然后下一步(一旦我们把“*开发”成一个名为test的variables)就是获取子string。 这只是以下?

 currentBranch=${test:2} 

我正在玩这个子string函数,我得到了很多“不好的replace”错误,不知道为什么。

*扩展了,你可以做的是使用sed而不是grep并立即得到分支的名字:

 branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p') 

还有一个使用git symbolic-ref的版本,正如Noufal Ibrahim所build议的那样

 branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') 

为了详细说明扩展(像marco已经做过的那样),扩展发生在echo中,当你使用包含“* master”的$ test进行echo $test ,根据正常的扩展规则扩展*。 要压制这个,就必须引用这个variables,如marco所示: echo "$test" 。 或者,如果在回显之前删除星号,则一切正常,例如echo ${test:2}只会回显“master”。 或者,您可以按照您的build议重新进行分配:

 branch=${test:2} echo $branch 

这将回应“主人”,就像你想要的。

在Noufal Ibrahim的答案上扩展,使用-short标志和git-symbolic-ref ,不需要大惊小怪。

我一直在使用这样的钩子,它运作良好:

 #!/bin/bash branch=$(git symbolic-ref --short HEAD) echo echo "**** Running post-commit hook from branch $branch" echo 

输出“****从分支主机运行后提交挂钩”

请注意, git-symbolic-ref仅适用于您在存储库中。 幸运的是,作为Git早期的遗留物, .git/HEAD包含相同的符号参考。 如果你想获得几个git仓库的活动分支,而不需要遍历目录,你可以像这样使用bash:

 for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done 

其输出如下所示:

 repo1 : master repo2 : dev repo3 : issue12 

如果你想更进一步,包含在.git/HEAD的full ref也是包含分支上次提交的SHA-1散列的文件的相对path。

我会在git核心中使用git-symbolic-ref命令。 如果你说git-symbolic-ref HEAD ,你会得到当前分支的名字。

我用这个git describe --contains --all HEAD在我的git帮手脚本中

例:

 #!/bin/bash branchname=$(git describe --contains --all HEAD) git pull --rebase origin $branchname 

我在~/scripts中有一个名为gpull的文件

问题依赖于:

 echo $test 

实际上,variablestesting包含一个由shell扩展的通配符。 为了避免这种情况,只用双引号保护$ test:

 echo "$test" 

禁用子shell扩展,

 test=$(set -f; git branch)