Yerel bir git şubesinin olup olmadığını öğrenmenin daha iyi bir yolu var mı?


191

Depomda yerel bir git dalı olup branch-nameolmadığını öğrenmek için aşağıdaki komutu kullanıyorum . Bu doğru mu? Daha iyi bir yol var mı?

Lütfen bunu bir script içinde yaptığımı unutmayın. Bu nedenle mümkünse sıhhi tesisat komutlarını kullanmak istiyorum .

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

Senin emrin kullandýđým gibi.
Paŭlo Ebermann

6
Cehaletimle birlikte giderdim git branch | grep -w <branch-name>. Tamam, bu bir porselen komut, ama bu özel parçanın gelecekte bu pasajı kullanılamaz hale getirmek için önemli ölçüde değişeceğini hayal edemiyorum ...
UncleZeiv

@UncleZeiv: Muhtemelen komutun kullanılamaz hale gelmesi için önemli ölçüde değişmeyeceği konusunda haklısınız. Porselen ve sıhhi tesisat gibi şeyler hakkında bir OKB var, hepsi bu.
Manoj Govindan

10
git rev-parse --verify <branch_name>etiketler ve taahhüt karmaları gibi diğer referansları da doğrular, bu nedenle ihtiyacınız olan şey için daha uygun olsa da, yalnızca dallarla tam olarak ilgileniyorsanız yanlış pozitifler döndürür.
Paul

2
YEREL bir dalın olup olmadığını belirlemek için yalnızca git show-ref çalışıyor. Güncellemede (git rev-parse ile sözdizimi), uzak bir dal eşleşirse dönüş kodu da 0 olur.
Fabien Bouleau

Yanıtlar:


57

Bildiğim kadarıyla, bunu bir senaryoda yapmanın en iyi yolu. Buna ekleyecek çok şey olduğundan emin değilim, ancak "Bu komut istediğiniz her şeyi yapıyor" diyen bir yanıt da olabilir :)

Dikkat etmek isteyebileceğiniz tek şey, şube adlarının içinde şaşırtıcı karakterler olabileceğidir, bu yüzden alıntı yapmak isteyebilirsiniz <branch-name>.


1
alıntı yapmak için iyi bir nokta <branch-name>. FWIW Bunu bir kumaş komut dosyasında kullanıyorum. Değişkeni alıntılamayı hatırlayacağım.
Manoj Govindan

Doğru cevap şudur: git show-ref --verify --quiet refs / heads / <branch-name> HEAD'in doğru bir şube olmadığını gösterecektir. git rev-parse --verify HEAD'in mevcut bir şube olduğunu söyleyecektir. Yanlış çünkü HEAD bir şube değil.
Paulo Neves

106

Bir arama motorunda 'git check şube var mı' aradığımda, bu sayfa ilk gördüğüm sayfa.

İstediğimi alıyorum, ancak orijinal gönderi 2011'den beri güncellenmiş bir cevap vermek istiyorum.

git rev-parse --verify <branch_name>

Bu aslında kabul edilen cevapla aynıdır, ancak "refs / heads /"


20
Sadece bir not: git rev-parse --verifysadece repoda böyle bir nesnenin var olup olmadığını söyler (yani herhangi bir değer için 0 döndürür <branch_name>, repodaki herhangi bir nesneye dönüşür). Bu nesnenin bir dal olup olmadığını söylemez.
tavnab

9
Bu, bir dalın var olup olmadığını nasıl soran soruya doğru bir cevap değildir. Bu size bir etiket için yanlış pozitif verir. Bunu kolayca kendiniz test edebilirsiniz. Refs / etiketlerde bulunan etiketlerden, hatta refs / uzaktan kumandalardaki uzaktan kumandalardan ayırmak için refs / heads / gerekir.
msouth

15
git rev-parse --hhfy sayfaları bana verir: ölümcül: Tek bir düzeltme gerekli
SuperUberDuper

@SuperUberDuper denediniz mi: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack

32

Neredeyse.

Sadece dışarıda bırakın --verifyve --quietve bunları yapmazsa ya dal varsa karma ya da hiçbir şey olsun.

Bir değişkene atayın ve boş bir dize olup olmadığını kontrol edin.

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

10
Dönüş değeri yeterlidir - bir değişkene atama olasılığının muhtemelen hataya meyilli olması gerekmemektedir.
msouth

15

git show-branchBurada kullanabileceğinizi düşünüyorum .

$ 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

Yani, $? == 0 dalın var olduğunu ve hiç refs / head / sıhhi tesisat kazmak zorunda olmadığını gösterir. -rŞov şubesine geçmediğiniz sürece, sadece yerel şubelerde faaliyet gösterecektir.


5
AFAIK git show-branchbir porselen komutudur. Sorumda söylediğim gibi, sıhhi tesisat eşdeğerleri mevcutsa, senaryoda porselen komutları kullanmak istemem. Bkz kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj: Porselen ve sıhhi tesisatın ne olduğunu biliyorum, ama sıhhi tesisatın porselenden daha kararlı olduğunu hiç okumamıştım. Beni dokümanlarýn içinde gösterdiđin için teţekkürler.
Mark Drago

Yanlışlıkla etiketleri bulmak önlemek için, ve şube yerel veya uzak belirtebilirsiniz olup olmadığı hakkında daha spesifik olması git show-branch refs/heads/[branch]veya git show-branch refs/remotes/origin/[branch].
twasbrillig

14

Ben tavsiye ederim git show-ref --quiet refs/heads/$name.

  • --quiet hiçbir çıkış olmadığı anlamına gelir, bu iyidir çünkü çıkış durumunu temiz bir şekilde kontrol edebilirsiniz.

  • refs/heads/$nameyerel şubelerle sınırlar ve tam adlarla eşleşir (aksi takdirde deveşleşir develop)

Bir komut dosyasında kullanım:

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

Evet, sessizce yapan tek kişi bu. Git komutlarının isimlendirilmesi biraz
çuval

11

Bir komut dosyasında kullanım için:

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

Bu, 0yalnızca <branch-name>yerel bir şube olarak varsa çıkar .

Misal:

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

2

Windows toplu komut dosyasında biraz farklı,

git rev-parse --verify <branch>

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

1

Diyelim git is_localbranch(içine takma ad eklemeniz gerekiyor .gitconfig).

Kullanımı:

$ git is_localbranch BRANCH

Kaynak:

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

1

İlk sorudaki 'Güncelleme' için 'Önerilen Düzenleme' konusundaki incelemenin sonucu 'Bu bir yorum veya cevap olarak yazılmalıdır', bu yüzden buraya gönderiyorum:

Başka bir yol dalları ama böyle adı ile herhangi bir referans doğrular değil yalnızca önerilen @jhuynh .

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

İlk sorudaki 'Güncelleme' ile ilgili sorun şöyle açıklandı:

'Master.000'in sadece bir etiket olduğunu varsayalım ve kontrol edelim, böyle bir yerel şube mevcut değil, grep bir etiket olan bir girdi döndürür. Bu tür yerel bir şube olmasa bile, başvuru varsa, yine de ayrıştırma 0 döndürecektir. Bu tam olarak @ paul-s tarafından belirtildiği gibi yanlış bir eşleşme

$ git show-ref |grep master.000

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



0

Ne davam git show-refne de git rev-parseçalışır.

$ 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

Bununla bitirdim

$ 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

Bir komut dosyasıyla da yapabilirsiniz

#!/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

Eğer grep eklemeyi başarabilirseniz.

git branch | grep -q <branch>

1
Şube adlarında bazen yaptığım gibi noktalar (".") Kullanırsanız, bu nokta size grepbir metakarakter olarak yorumlandığı için yanlış cevap verebilir .
Peter John Acklam

1
Ayrıca adı gerçek bir dalın alt dizesi olan bir dalı test ederseniz de yanlış pozitif alırsınız. abcdenilen bir şube varsa, örneğin eşleşecektir abcdef.
rjmunro

-1

Bir komut dosyasında kullanmak için aşağıdaki komutu öneririm:

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

<repo_url>Bunun bir "." Olabileceğini unutmayın . dizin yapısındaysanız yerel repoyu, yerel bir repo yolunu veya uzak bir repo adresini belirtmek için.

Eğer yoksa, komut 1 değilse 0 döndürür <branch_name>.


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

ardından dönüş değerinin 0 veya 1 olduğunu kontrol edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.