มีวิธีที่ดีกว่าในการดูว่ามีสาขา git ในพื้นที่หรือไม่?


191

ฉันใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าสาขา git ท้องถิ่นที่มีbranch-nameอยู่ในพื้นที่เก็บข้อมูลของฉัน ถูกต้องหรือไม่ มีวิธีที่ดีกว่า?

โปรดทราบว่าฉันกำลังทำสิ่งนี้ภายในสคริปต์ ด้วยเหตุนี้ฉันต้องการใช้คำสั่งการวางท่อถ้าเป็นไปได้

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

คำสั่งของคุณดูเหมือนว่าฉันเคยใช้
Paŭlo Ebermann

6
git branch | grep -w <branch-name>ในความโง่เขลาของฉันฉันได้ไปด้วย ตกลงมันเป็นคำสั่งเครื่องเคลือบดินเผา แต่ฉันไม่สามารถจินตนาการได้ว่าการใช้งานเฉพาะนี้จะเปลี่ยนแปลงอย่างมีนัยสำคัญในอนาคตเพื่อทำให้ตัวอย่างข้อมูลนี้ใช้ไม่ได้ ...
UncleZeiv

@ UncleZeiv: คุณอาจถูกต้องที่คำสั่งจะไม่เปลี่ยนแปลงอย่างมีนัยสำคัญเพื่อให้ใช้ไม่ได้ ฉันมี OCD เล็กน้อยเกี่ยวกับสิ่งต่าง ๆ เช่นเครื่องเคลือบดินเผากับการประปานั่นคือทั้งหมดที่
Manoj Govindan

10
git rev-parse --verify <branch_name>ตรวจสอบการอ้างอิงอื่น ๆ เช่นแท็กและกระทำการแฮชดังนั้นแม้ว่ามันอาจจะเหมาะสมกว่าสำหรับสิ่งที่คุณต้องการมันจะส่งคืนผลบวกปลอมหากคุณสนใจเฉพาะในสาขาเท่านั้น
พอลเอส.

2
เฉพาะ git show-ref เท่านั้นที่ทำงานเพื่อตรวจสอบว่ามีสาขาในท้องถิ่นอยู่หรือไม่ ในการอัปเดต (ไวยากรณ์ที่มี git rev-parse) โค้ดส่งคืนจะเป็น 0 หากสาขาระยะไกลตรงกัน
Fabien Bouleau

คำตอบ:


57

เท่าที่ฉันรู้นั่นเป็นวิธีที่ดีที่สุดในการทำสคริปต์ ฉันไม่แน่ใจว่ามีอะไรเพิ่มเติมให้เพิ่มเข้าไปอีก แต่อาจมีคำตอบเพียงคำเดียวที่บอกว่า "คำสั่งนั้นทำทุกอย่างที่คุณต้องการ" :)

<branch-name>สิ่งเดียวที่คุณอาจต้องการที่จะต้องระวังคือชื่อสาขาสามารถมีตัวละครที่น่าแปลกใจในพวกเขาดังนั้นคุณอาจต้องการที่จะพูด


1
<branch-name>จุดที่ดีเกี่ยวกับการอ้าง FWIW ฉันใช้สิ่งนี้ในสคริปต์ผ้า ฉันจะจำคำพูดของตัวแปร
Manoj Govindan

คำตอบที่ถูกต้องคือสิ่งนี้โดยปริยาย: git show-ref - ตรวจสอบ - เงียบ refs / หัว / <branch-name> จะแสดงว่า HEAD ไม่ใช่สาขาที่ถูกต้อง git rev-parse - ยืนยันจะบอกคุณว่า HEAD เป็นสาขาที่มีอยู่แล้ว เท็จเพราะ HEAD ไม่ใช่สาขา
เปาโลเนเวส

106

เมื่อฉันค้นหา 'ตรวจสอบคอมไพล์ถ้ามีสาขา' ในเครื่องมือค้นหาหน้านี้คืออันแรกที่ฉันเห็น

ฉันได้รับสิ่งที่ฉันต้องการ แต่ฉันต้องการให้คำตอบที่อัปเดตตั้งแต่โพสต์ดั้งเดิมมาจาก 2011

git rev-parse --verify <branch_name>

นี่เป็นหลักเหมือนกับคำตอบที่ยอมรับ แต่คุณไม่จำเป็นต้องพิมพ์ใน "refs / heads /"


20
เพียงทราบ: git rev-parse --verifyเพียงบอกคุณว่าวัตถุดังกล่าวมีอยู่ใน repo (เช่นมันจะกลับ 0 สำหรับค่าใด ๆ ของการ<branch_name>แปลที่เป็นวัตถุประเภทใด ๆ ใน repo) มันไม่ได้บอกคุณว่าวัตถุนั้นเป็นสาขาหรือไม่
tavnab

9
นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามซึ่งถามว่าจะรู้ได้อย่างไรว่ามีสาขาอยู่ สิ่งนี้จะให้ผลบวกกับแท็กเป็นเท็จ คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดาย คุณต้องการ refs / heads / เพื่อแยกความแตกต่างจากแท็กที่อยู่ใน refs / แท็กและแม้กระทั่ง remotes ใน refs / remotes
msouth

15
git rev-parse - ตรวจสอบ gh-pages ให้ฉัน: ร้ายแรง: ต้องการการแก้ไขครั้งเดียว
SuperUberDuper

@SuperUberDuper คุณลอง: git rev-parse - ตรวจสอบ ** origin / ** gh-pages?
RoyalBigMack

32

เกือบจะมี.

เพียงแค่ปล่อยออกมา--verifyและ--quietและคุณได้รับทั้งกัญชาถ้าสาขาที่มีอยู่หรือไม่มีอะไรถ้ามันไม่ได้

กำหนดให้กับตัวแปรและตรวจสอบสตริงว่าง

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

10
ค่าส่งคืนเพียงพอ - คุณไม่จำเป็นต้องผ่านความพยายามผิดพลาดในการกำหนดตัวแปร
msouth

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 จะระบุว่าสาขานั้นมีอยู่และคุณไม่จำเป็นต้องขุดลงในท่อประปาของหัว / หัว / เลย ตราบใดที่คุณไม่ผ่าน-rการแสดงสาขาจะทำงานเฉพาะในสาขาท้องถิ่น


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

14

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 นั้นค่อนข้าง
แย่

11

สำหรับใช้ในสคริปต์:

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

นี่จะเป็นการออก0หากว่า<branch-name>เป็นสาขาท้องถิ่นเท่านั้น

ตัวอย่าง:

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


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 ส่งกลับหนึ่งรายการ wchich เป็นแท็ก การแยกวิเคราะห์ซ้ำจะส่งคืนค่า 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-refมิได้git 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

1
คุณจะได้รับผลบวกปลอมหากคุณทดสอบสาขาที่มีชื่อเป็นสตริงย่อยของสาขาจริง เช่นจะตรงกับถ้ามีสาขาที่เรียกว่าabc abcdef
rjmunro

-1

เพื่อใช้ในสคริปต์ฉันขอแนะนำคำสั่งต่อไปนี้:

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

โปรดทราบว่า<repo_url>อาจเป็น "." เพื่อระบุ repo ภายในเครื่องหากคุณอยู่ในโครงสร้างไดเรกทอรีเส้นทางไปยัง repo ภายในเครื่องหรือที่อยู่ของ repo ระยะไกล

คำสั่งจะคืนค่า 0 หาก<branch_name>ไม่มีในปัจจุบันถ้า 1


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.