我在玩那个子串函数的时候,经常出现 "错误替换 "的错误,我也不知道为什么。

3 个评论
如果你在星号周围使用单引号。 '*' 而不是 "*"
wich
@glenn 这不是扩展发生的地方,而是在回声中,正如Marco已经阐述的那样。
linux
git
bash
shell
ubuntu
Ben
Ben
发布于 2010-01-22
6 个回答
wich
wich
发布于 2010-01-22
已采纳
0 人赞同

*被扩展了,你可以做的是用sed代替grep,立即得到分支的名称。

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

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

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

为了详细说明扩展,(正如Marco已经做的那样,)扩展发生在回声中。当你做echo $test时,$test包含* master,那么*会根据正常的扩展规则进行扩展。为了抑制这一点,我们必须引用这个变量,如marco所示。echo "$test"。另外,如果你在回显之前把星号去掉,一切都会好起来的,例如:echo ${test:2}将只回显master。另外,你也可以按照你的建议重新分配它。

branch=${test:2}
echo $branch

这将呼应master,如你所愿。

如果你用我的答案来更新你的答案,你应该提到我的答案,这将是很有礼貌的。
wich
当然,我很抱歉,我在离开前迅速更新,错过了归属。
好吧,我试了这两种方法,我必须说, symbolic-ref 并不总是有效的。 例如:如果你检查一些旧的提交,它会抛出错误,而 sed 命令给出的是 (HEAD detached at 1qw23er)
注意:第一种技术即使在分支名称中有正斜杠也能工作(例如,因为它是一个问题的URL),为什么第二种技术在这种情况下只取最后一段。
替换代码0】让这一切变得更加简单,实际上! branch=$(git branch | sed '/^ /d;s/^\* //')
joemaller
joemaller
发布于 2010-01-22
0 人赞同

在此基础上扩展 Noufal Ibrahim的回答 ,使用 --short 标志与 git-symbolic-ref ,不需要与 sed 打交道。

我一直在钩子里使用这样的东西,效果很好。

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

输出 "**** 从分支master运行提交后钩子"

请注意,git-symbolic-ref只在你处于一个仓库中时才有效。幸运的是.git/HEAD,作为Git早期的遗留物,包含同样的符号参考。如果你想获得几个git仓库的活动分支,而不需要遍历目录,你可以使用像这样的bash单行程序。

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

Which outputs something like:

repo1 : master  
repo2 : dev  
repo3 : issue12

如果你想更进一步,.git/HEAD中包含的完整参考文献也是一个相对路径,它包含该分支最后一次提交的SHA-1哈希值的文件。

Pat
alias currentgitbranch='git symbolic-ref --short HEAD'
这是最佳答案,使用 --short 可以得到你想要的字符串。谢谢!
Noufal Ibrahim
Noufal Ibrahim
发布于 2010-01-22
0 人赞同

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

在以后的git版本中,你将不得不使用git symbolic-ref HEAD来代替。
你想使用 -- 短标记,只获得分支名称。举个例子。在主分支上 git-symbolic-ref HEAD 输出 refs/heads/master ,但`git-symbolic-ref --short HEAD`只输出 master
NullVoxPopuli
NullVoxPopuli
发布于 2010-01-22
0 人赞同

I use this git describe --contains --all HEAD in my git helper scripts

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

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

Edit:

对于很多CI环境来说,他们会在 "分离头 "的状态下检查你的代码,所以我就用。

BRANCH=$(\
  git for-each-ref \
  --format='%(objectname) %(refname:short)' refs/heads \
  | awk "/^$(git rev-parse HEAD)/ {print \$2}"\
    
替换代码0】并没有给我当前的分支,因为用 git branch 的星星突出显示。
这在Jenkins的构建脚本中是很有用的,谢谢
注意。使用git describe,如果你在HEAD上有一个标签,它会给你标签名而不是分支名。
marco
marco
发布于 2010-01-22
0 人赞同

The problem relies on:

echo $test

事实上,变量test包含一个通配符,会被shell扩展。为了避免这一点,只需用双引号保护$test。

echo "$test"