ローカルgitブランチが存在するかどうかを確認するより良い方法はありますか?


191

次のコマンドを使用して、リポジトリにローカル gitブランチがbranch-name存在するかどうかを確認しています。これは正しいです?もっと良い方法はありますか?

これはスクリプト内で行っていることに注意してください。このため、可能であれば配管コマンド使用したいと思います

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

あなたのコマンドは、私が使用したものに似ています。
–PaŭloEbermann、2011

6
私の知らないところで、私はと一緒に行きましたgit branch | grep -w <branch-name>。わかりました、それは磁器のコマンドですが、このスニペットを使用不可能にするために、この特定の使用法が将来大幅に変更されるとは想像できません...
UncleZeiv

@UncleZeiv:コマンドが大幅に変更されて使用できなくなることはおそらく正しいでしょう。私は磁器と配管のようなものについて少しOCDを持っています、それだけです。
Manoj Govindan

9
git rev-parse --verify <branch_name>タグやコミットハッシュなどの他の参照も検証します。必要な場合により適している可能性がありますが、ブランチにのみ関心がある場合は誤検知を返します。
Paul S.

2
git show-refのみが、LOCALブランチが存在するかどうかを判別するために機能しています。更新(git rev-parseを使用した構文)では、リモートブランチが一致した場合の戻りコードも0です。
Fabien Bouleau 2017

回答:


57

私の知る限り、それはスクリプトでそれを行うための最良の方法です。これに追加すべきことが他にもあるかどうかはわかりませんが、「そのコマンドですべてのことを実行できる」という答えが1つある場合もあります。

注意が必要なのは、ブランチ名に意外な文字が含まれている可能性があるため、引用符で囲むことです<branch-name>


1
引用についての良い点<branch-name>。FWIWこれをファブリックスクリプトで使用しています。変数を引用することを覚えておきます。
Manoj Govindan

正解はこれです。gitshow-ref --verify --quiet refs / heads / <branch-name>は、HEADがブランチではないことを示します。git rev-parse --verifyは、HEADが既存のブランチであることを通知します。HEADはブランチではないため、False。
Paulo Neves 2017

106

検索エンジンで「git check if branch exists」を検索すると、このページが最初に表示されます。

欲しいものを手に入れましたが、元の投稿が2011年であったため、更新された回答を提供したいと思います。

git rev-parse --verify <branch_name>

これは基本的に受け入れられた回答と同じですが、「refs / heads /」を入力する必要はありません


20
ただ注:git rev-parse --verifyそのようなオブジェクトがリポジトリに存在するかどうかのみを通知します(つまり、リポジトリ<branch_name>内の任意のタイプのオブジェクトに変換される値に対して0を返します)。そのオブジェクトがブランチであるかどうかはわかりません。
tavnab 2015年

9
これは、ブランチが存在するかどうかを知る方法を尋ねる質問に対する正しい答えではありません。これにより、タグの誤検知が発生します。これは簡単に自分でテストできます。refs / heads /は、refs / tags内のタグ、およびrefs / remotes内のリモートと区別するために必要です。
msouth 2016年

15
git rev-parse
--gh

@SuperUberDuperは試しましたか:git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack

33

ほとんどあります。

ただ、うちのまま--verify--quietし、そうでない場合は、どちらかの分岐が存在する場合、ハッシュまたは何を取得します。

それを変数に割り当て、空の文字列を確認します。

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

10
戻り値で十分です。変数に割り当てるというエラーが発生しやすい作業を行う必要はありません。
msouth 2016年

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 /の配管をまったく掘り下げる必要がないことを示します。-rshow-branchにパスしない限り、ローカルブランチでのみ動作します。


5
AFAIK git show-branch磁器のコマンドです。質問で述べたように、配管の同等物が利用できる場合は、スクリプトで磁器のコマンドを使用しません。kernel.org/pub/software/scm/git/docsを
Manoj Govindan

3
@Manoj:磁器と配管の違いについては知っていますが、配管が磁器よりも安定していると考えられていることを読んだことがありませんでした。ドキュメントでそれを指摘してくれてありがとう。
Mark Drago

誤ってタグを見つけるのを避け、ブランチがローカルかリモートかをより具体的にするには、git show-branch refs/heads/[branch]またはを指定できますgit show-branch refs/remotes/origin/[branch]
twasbrillig 2018年

13

お勧め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

うん、これは黙ってそれを行う唯一のものです。gitコマンドの命名は少しおかしいです
smac89

10

スクリプトで使用する場合:

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

これは、ローカルブランチとして存在する0場合にのみ終了し<branch-name>ます。

例:

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

2

Windowsバッチスクリプトでは少し異なります。

git rev-parse --verify <branch>

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


1

それを呼び出しましょうgit is_localbranch(エイリアスをに追加する必要があります.gitconfig)。

使用法:

$ git is_localbranch BRANCH

ソース:

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

1

最初の質問の「更新」に対する「提案された編集」のレビューの結果は「コメントまたは回答として記述されているはずです」でしたので、ここに投稿します。

別の方法で提案されている枝を検証しますが、このような名前を持つ任意の参照だけでなく、@jhuynh

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

説明された最初の静止に関する「更新」の問題:

'master.000'がタグのみであることを想定して確認します。このようなローカルブランチは存在しません。grepはタグである1つのエントリを返します。そのようなローカルブランチが存在しない場合でも、参照が存在する場合、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


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

-1

grepを含めることができれば。

git branch | grep -q <branch>

1
私が時々使うように、ブランチ名にドット( "。")を使用すると、ドットはgrepメタ文字として解釈されるため、間違った答えになる可能性があります。
Peter John Acklam、2015

1
名前が実際のブランチのサブストリングであるブランチをテストした場合も、誤検知が発生します。たとえばabc、というブランチがある場合に一致しabcdefます。
rjmunro

-1

スクリプトで使用するには、次のコマンドをお勧めします。

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

<repo_url>単に「。」にすることができることに注意してください。ディレクトリ構造、ローカルリポジトリへのパス、またはリモートリポジトリのアドレス内にいる場合は、ローカルリポジトリを指定します。

コマンドは、<branch_name>存在しない場合は0を返し、存在する場合は1を返します。


-1
git branch --list $branch_name | grep $branch_name

次に、戻り値が0または1であることを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.