用于检查指定Git分支是否存在的Shell脚本?

hzx*_*zxu 24 git bash shell grep

我需要使用shell脚本创建一个Git分支,但由于分支可能存在,我需要注意这一点.目前我正在使用:

if [ `git branch | grep $branch_name` ]
then
    echo "Branch named $branch_name already exists"
else
    echo "Branch named $branch_name does not exist"
fi
Run Code Online (Sandbox Code Playgroud)

但问题是grep命令找到分支名称而没有匹配确切的名称,也就是说,如果我grep name随后使用名称进行分支branch-name将匹配.

那么有更好的方法吗?

谢谢!

Hea*_*ath 47

注意:这总是返回true.这不是问题的正确答案,即使它已被接受....

你总是可以使用单词边界周围的名称,如\<\>,而是让Git来完成的工作,为您提供:

if [ `git branch --list $branch_name` ]
then
   echo "Branch name $branch_name already exists."
fi
Run Code Online (Sandbox Code Playgroud)

  • 如果[[\`git branch --list master \`“]],这是一个自动格式的问题(backtic已转换为代码标记)。然后回声 fi`答案实际上总是返回true ...基本上与我的过失相同。 (4认同)
  • if ["`git branch --list $ {BRANCHNAME}`"] (3认同)
  • @JeffCharter会不会总是评估为true? (3认同)
  • 请不要这样做,直到您阅读 [其他链接的答案](http://stackoverflow.com/questions/5167957/is-there-a-better-way-to-find-out-if-a-local- git 分支存在)。总结:`git show-ref` (2认同)
  • 始终返回true的解决方案可能只是检查返回的内容是否为空:`if [-n“ $(git branch --list $ branch_name)”]。虽然未经测试。 (2认同)

Dav*_*vid 5

我喜欢Heath的解决方案,但是如果您仍然希望通过管道传递给grep,则可以使用类似于以下内容的正则表达式锚来排除与子字符串的匹配:

if [ `git branch | egrep "^[[:space:]]+${branchname}$"` ]
then
    echo "Branch exists"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使用space字符类,因为命令的输出是缩进的。

  • 如果您在分支机构中,那么开始时会有一个星星。这对于正确匹配`git branch |更好。egrep“ ^ \ *?[[:space:]] + $ {BRANCH} $”` (3认同)