Apakah ada cara yang lebih baik untuk mengetahui apakah ada cabang git lokal?

192

Saya menggunakan perintah berikut untuk mencari tahu apakah ada cabang git lokalbranch-name di repositori saya. Apakah ini benar? Apakah ada cara yang lebih baik?

Harap dicatat bahwa saya melakukan ini di dalam skrip. Untuk alasan ini saya ingin menggunakan perintah pipa ledeng jika memungkinkan.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Manoj Govindan
sumber
Perintah Anda terlihat seperti yang saya gunakan.
Paŭlo Ebermann
6
Dalam ketidaktahuan saya, saya akan pergi dengan git branch | grep -w <branch-name>. Oke, ini perintah porselen, tapi saya tidak bisa membayangkan penggunaan khusus ini akan berubah secara signifikan di masa depan untuk membuat cuplikan ini tidak dapat digunakan ...
UncleZeiv
@UncleZeiv: Anda mungkin benar bahwa perintah tidak akan berubah secara signifikan untuk membuatnya tidak dapat digunakan. Saya punya sedikit OCD tentang hal-hal seperti porselen versus pipa, itu saja.
Manoj Govindan
10
git rev-parse --verify <branch_name>memverifikasi juga referensi lain seperti tag dan melakukan hash, jadi meskipun mungkin lebih cocok untuk apa yang Anda butuhkan itu akan mengembalikan positif palsu jika Anda hanya tertarik pada cabang.
Paul S.
2
Hanya show-ref git yang bekerja untuk menentukan apakah cabang LOCAL ada. Dalam pembaruan (sintaks dengan git rev-parse), kode kembali juga 0 jika cabang jarak jauh cocok.
Fabien Bouleau

Jawaban:

57

Sejauh yang saya tahu, itulah cara terbaik untuk melakukannya dalam sebuah skrip. Saya tidak yakin ada banyak lagi yang perlu ditambahkan, tetapi mungkin ada satu jawaban yang hanya mengatakan "Perintah itu melakukan semua yang Anda inginkan" :)

Satu-satunya hal yang Anda perlu berhati-hati adalah bahwa nama cabang dapat memiliki karakter yang mengejutkan di dalamnya, sehingga Anda mungkin ingin mengutip <branch-name>.

Mark Longair
sumber
1
Poin bagus tentang mengutip <branch-name>. FWIW Saya menggunakan ini dalam skrip kain. Saya akan ingat untuk mengutip variabel.
Manoj Govindan
Jawaban yang benar adalah ini secara implisit: git show-ref --verify --quiet refs / heads / <branch-name> akan menunjukkan bahwa HEAD bukan cabang dengan benar. git rev-parse --verify akan memberi tahu Anda bahwa HEAD adalah cabang yang ada. Salah karena KEPALA bukan cabang.
Paulo Neves
106

Ketika saya mencari 'git check apakah ada cabang' di mesin pencari, halaman ini adalah yang pertama saya lihat.

Saya mendapatkan apa yang saya inginkan, tetapi saya ingin memberikan jawaban yang diperbarui karena pos aslinya berasal dari 2011.

git rev-parse --verify <branch_name>

Ini pada dasarnya sama dengan jawaban yang diterima, tetapi Anda tidak perlu mengetikkan "referensi / kepala /"

jhuynh
sumber
20
Hanya sebuah catatan: git rev-parse --verifyhanya memberi tahu Anda jika objek seperti itu ada di repo (yaitu akan mengembalikan 0 untuk nilai apa pun <branch_name>yang diterjemahkan ke objek jenis apa pun di repo). Itu tidak memberi tahu Anda apakah objek itu cabang atau tidak.
tavnab
9
Ini bukan jawaban yang benar untuk pertanyaan itu, yang menanyakan bagaimana cara mengetahui apakah ada cabang. Ini akan memberi Anda positif palsu untuk tag. Anda dapat dengan mudah menguji ini sendiri. Anda perlu ref / kepala / untuk membedakan dari tag yang ada di ref / tag, dan bahkan remote di ref / remote.
msouth
15
git rev-parse --verify gh-pages memberi saya: fatal: Diperlukan satu revisi
SuperUberDuper
@SuperUberDuper apakah Anda mencoba: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack
32

Hampir sampai.

Biarkan saja --verifydan --quietdan Anda mendapatkan hash jika cabang ada atau tidak ada jika tidak.

Tetapkan ke variabel dan periksa string kosong.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Martijn
sumber
10
Nilai kembaliannya cukup - Anda tidak perlu melalui upaya rawan kesalahan yang mungkin dilakukan untuk variabel.
msouth
15

Saya pikir Anda bisa menggunakannya di git show-branchsini.

$ 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

Jadi, $? == 0 akan menunjukkan bahwa cabang ada dan Anda tidak perlu menggali saluran ref / head / sama sekali. Selama Anda tidak lolos -rke show-branch, itu hanya akan beroperasi di cabang lokal.

Mark Drago
sumber
5
AFAIK git show-branchadalah perintah porselen . Seperti yang telah saya katakan dalam pertanyaan saya, saya lebih suka tidak menggunakan perintah porselen dalam skrip jika ada persamaan pipa ledeng. Lihat kernel.org/pub/software/scm/git/docs
Manoj Govindan
3
@ Manoj: Saya tahu tentang porselen vs. pipa ledeng, tetapi saya belum pernah membaca bahwa pipa ledeng dianggap lebih stabil daripada porselen. Terima kasih telah menunjukkan saya pada dokumen.
Mark Drago
Untuk menghindari menemukan tag secara tidak sengaja, dan lebih spesifik tentang apakah cabang itu lokal atau jauh, Anda dapat menentukan git show-branch refs/heads/[branch]atau git show-branch refs/remotes/origin/[branch].
twasbrillig
14

Saya merekomendasikan git show-ref --quiet refs/heads/$name.

  • --quiet berarti tidak ada output, yang bagus karena Anda dapat dengan bersih memeriksa status keluar.

  • refs/heads/$namemembatasi cabang lokal dan mencocokkan nama lengkap (jika devtidak cocok develop)

Penggunaan dalam skrip:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
Razzi Abuissa
sumber
Yap, ini adalah satu-satunya yang melakukannya diam-diam. Penamaan perintah git agak
ganjil
11

Untuk digunakan dalam skrip:

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

Ini akan keluar 0jika dan hanya jika <branch-name>ada sebagai cabang lokal.

Contoh:

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

Pada skrip batch windows agak berbeda,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
vansia pinkal
sumber
1

Sebut saja git is_localbranch(Anda perlu menambahkan alias di .gitconfig).

Pemakaian:

$ git is_localbranch BRANCH

Sumber:

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

sumber
1

Hasil ulasan pada 'Edit yang Disarankan' untuk 'Pembaruan' pada pertanyaan awal adalah 'Seharusnya ditulis sebagai komentar atau jawaban', jadi saya mempostingnya di sini:

Cara lain yang diusulkan tidak hanya akan memverifikasi cabang tetapi referensi dengan nama tersebut @jhuynh .

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

Masalah dengan 'Pembaruan' pada pertanyaan awal menjelaskan:

Mari kita asumsikan dan periksa bahwa 'master.000' hanya sebuah tag, cabang lokal seperti itu tidak ada, grep mengembalikan satu entri yang merupakan tag. Masih rev-parse akan mengembalikan 0 jika referensi ada, bahkan jika cabang lokal seperti itu tidak ada. Ini adalah kecocokan yang salah, persis seperti yang disebutkan oleh @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0
Pshemy108
sumber
1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no
Vojtech Vitek
sumber
0

Baik git show-refatau git rev-parsebekerja pada kasus saya.

$ 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

Saya berakhir dengan ini

$ 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

Anda dapat melakukannya juga dengan file skrip

#!/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
Chetabahana
sumber
-1

Jika Anda bisa memasukkan grep.

git branch | grep -q <branch>
Daniel Vikström
sumber
1
Itu mungkin memberi Anda jawaban yang salah jika Anda menggunakan titik (".") Dalam nama cabang, seperti yang kadang-kadang saya lakukan, karena titik diartikan grepsebagai metacharacter.
Peter John Acklam
1
Anda juga akan mendapatkan false positive jika Anda menguji untuk cabang yang namanya adalah substring dari cabang nyata. misalnya abcakan cocok jika ada cabang yang dipanggil abcdef.
rjmunro
-1

Untuk digunakan dalam skrip, saya merekomendasikan perintah berikut:

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

Perhatikan bahwa <repo_url>hanya bisa menjadi "." untuk menentukan repo lokal jika Anda berada di dalam struktur direktori, jalur ke repo lokal, atau alamat repo jarak jauh.

Perintah mengembalikan 0 jika <branch_name>tidak ada 1 jika ada.

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

kemudian periksa nilai kembali adalah 0 atau 1.

Howell ZHU
sumber