如何获得当前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)