是否有更好的方法来查找本地git分支是否存在?

我正在使用以下命令来查找我的存储库中是否存在branch-name当地的 git分支。这对吗?有没有更好的办法?

请注意,我是在脚本中执行此操作的。因此,如果可能的话,我想使用管道命令

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

我认为你可以在这里使用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将指示分支存在 你根本不需要去挖掘裁判/人头的管道。只要你没有将-r传递给show-branch

.它将只在本地分支上操作

据我所知,这是在脚本中实现它的最佳方式。我不确定是否有更多的补充,但可能有一个答案只是说“这个命令做你想要的一切”:)

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

差不多了。

只要忽略--verify--quiet,如果分支存在,你就得到散列,如果分支不存在,你就什么都得不到。

将其赋值给一个变量并检查是否为空字符串。

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

如果您能设法包括grep。

git branch | grep -q <branch>

让我们称它为git is_localbranch(你需要在.gitconfig中添加别名)。

用法:

$ git is_localbranch BRANCH

来源:

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

当我在搜索引擎上搜索“git检查分支是否存在”时,这个页面是我看到的第一个页面。

我得到了我想要的,但我想提供一个更新的答案,因为最初的帖子是2011年的。

git rev-parse --verify <branch_name>

这与已接受的答案本质上是一样的,但你不需要输入“;refs/heads/<branch_name>"”

从shell脚本来看,这将是

if [ `git rev-parse --verify main 2>/dev/null` ]
then
...
fi

在windows批处理脚本有点不同,

git rev-parse --verify <branch>


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

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

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

注意,<repo_url>可以只是一个“。”来指定本地回收,如果你在它的目录结构中,本地回收的路径,或远程回收的地址。

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

git branch --list $branch_name | grep $branch_name

然后检查返回值是0还是1。

我推荐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

我对最初问题“更新”的“建议编辑”的审查结果是“它应该作为评论或答案写出来”,所以我把它贴在这里:

所提议的另一种方式不仅会验证分支,还会验证任何名为@jhuynh的引用。

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

关于初始问题的“更新”问题解释如下:

让我们假设并检查master。000'只是一个标记,这样的本地分支不存在,grep返回一个标记条目。如果引用存在,仍然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

在脚本中使用:

git show-ref -q --heads <branch-name>

当且仅当<branch-name>存在时退出0

.作为一个本地分支

例子:

if git show-ref -q --heads <branch-name>; then
echo 'Branch exists'
fi

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

是的,有一个。

git rev-parse [<options>] <args>…​

请参阅https://git-scm.com/docs/git-rev-parse,在那里您可以找到参数集和函数。

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

这是我实现的方法,看起来更稳定

$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

要验证远程上是否存在分支,这对我来说很好:

git branch -r | grep -qn origin/${GIT_BRANCH_NAME}$ && echo "branch exists" || echo "branch does not exists"

git branch -l <branch-name>

如果分支存在,则返回分支名称;如果分支不存在,则返回none