有没有更好的方法来确定是否存在本地git分支?

时间:2011-03-02 13:13:05

标签: git git-branch git-commands

我使用以下命令查明我的存储库中是否存在带有branch-name本地 git分支。它是否正确?还有更好的方法吗?

请注意我在脚本中执行此操作。因此,如果可能的话,我想远离瓷器命令。

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

更新

原来有another way。谢谢@jhuynh

git rev-parse --verify <branch-name>
# $? == 0 means local branch with name <branch-name> exists.

16 个答案:

答案 0 :(得分:93)

当我在搜索引擎上搜索'git check if branch exists'时,这个页面是我看到的第一个页面。

我得到了我想要的东西,但我想提供一份更新的答案,因为原帖是从2011年开始的。

git rev-parse --verify <branch_name>

这与接受的答案基本相同,但您不需要输入“refs / heads /”

答案 1 :(得分:44)

据我所知,这是在脚本中执行此操作的最佳方式。我不确定还有更多要补充的内容,但也可能只有一个答案就是说“那个命令能做你想做的一切”:)

您唯一需要注意的是分支名称中可能包含令人惊讶的字符,因此您可能需要引用<branch-name>

答案 2 :(得分:27)

几乎就在那里。

只需省略--verify--quiet,如果分支存在则获得散列,如果不存在,则获取任何内容。

将其分配给变量并检查空字符串。

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

答案 3 :(得分:15)

我认为你可以在这里使用git show-branch

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

那么,$? == 0表示分支存在,你不必深入挖掘refs / heads /的管道。只要您没有将-r传递给show-branch,它就只能在本地分支上运行。

答案 4 :(得分:11)

我推荐git show-ref --quiet refs/heads/$name

  • --quiet表示没有输出,这很好,因为您可以干净地检查退出状态。

  • refs/heads/$name限制本地分支机构并匹配全名(否则dev将匹配develop

脚本中的用法:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

答案 5 :(得分:2)

在Windows批处理脚本上,它有点不同,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)

答案 6 :(得分:1)

我们称之为git is_localbranch(您需要在.gitconfig中添加别名)。

用法:

$ git is_localbranch BRANCH

来源:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

答案 7 :(得分:1)

git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no

答案 8 :(得分:0)

在初始问题上对“更新”的“建议编辑”进行审核的结果是“它应该写成评论或答案”,所以我在这里发布:

提议的another way不仅会验证分支,还会验证具有此类名称@jhuynh的任何引用。

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

关于初始静止的'更新'的问题解释了:

让我们假设并检查'master.000'只是一个标签,这样的本地分支不存在,grep返回一个条目wchich是一个标签。如果引用存在,仍然会使rev-parse返回0,即使这样的本地分支不存在。这是一个错误的匹配,完全如@paul-s

所述
$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0

答案 9 :(得分:0)

我想在浏览器中使用它,所以我制作了一个小应用程序,让您检查分支名称的有效性。它由git支持,所以你知道你得到了什么。

https://branch-checker.herokuapp.com/validate?branch=not//valid

答案 10 :(得分:0)

git show-refgit rev-parse都不适合我的情况。

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

我结束了这个

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

您也可以使用脚本文件

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

答案 11 :(得分:0)

是的,有一个。 git rev-parse []… https://git-scm.com/docs/git-rev-parse 在哪里可以找到参数集和函数。

        git rev-parse --verify <branch-name>

答案 12 :(得分:0)

我就是这样实现的,我觉得看起来更稳定

$branchExists = git ls-remote $gitUrl $gitBranch
if(!([bool]$branchExists))
{
   Write-Host "branch $branchName does not exist"  
} 
else
{
   Write-Host "branch $branchName exists"         
}

如果分支存在,则 branchExist 变量的内容将类似于:

hashcode of branch name         feature/my_branch

答案 13 :(得分:-1)

如果你能设法包括grep。

git branch | grep -q <branch>

答案 14 :(得分:-1)

要在脚本中使用,我建议使用以下命令:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

请注意,<repo_url>只能是&#34;。&#34;如果您在其目录结构中,指定本地存储库,本地存储库的路径或远程存储库的地址,则指定本地存储库。

如果<branch_name>不存在,则该命令返回0(如果存在)。

答案 15 :(得分:-1)

$ git branch --list $ branch_name | grep $ branch_name 然后检查返回值是0还是1.