क्या यह पता लगाने का एक बेहतर तरीका है कि क्या स्थानीय गिट शाखा मौजूद है?


191

मैं निम्नलिखित आदेश का उपयोग यह जानने के लिए कर रहा हूं कि क्या कोई स्थानीय गिट शाखा branch-nameमेरे भंडार में मौजूद है। क्या ये सही है? क्या कोई बेहतर तरीका है?

कृपया ध्यान दें कि मैं यह एक स्क्रिप्ट के अंदर कर रहा हूं। इस कारण से यदि संभव हो तो मैं प्लंबिंग कमांड का उपयोग करना चाहूंगा ।

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

आपकी कमान वैसी ही दिखती है जैसी मैंने इस्तेमाल की थी।
पाओलो एबरमैन

6
अपने अज्ञान में, मैं साथ चला गया git branch | grep -w <branch-name>। ठीक है, यह एक चीनी मिट्टी के बरतन कमान है, लेकिन मैं इस विशेष उपयोग की कल्पना नहीं कर सकता कि भविष्य में इस स्निपेट को अनुपयोगी बनाने के लिए काफी परिवर्तन हो ...
अंकलज़ेव

@UncleZeiv: आप शायद सही हैं कि इसे अनुपयोगी बनाने के लिए कमांड महत्वपूर्ण रूप से नहीं बदलेगा। मुझे चीनी मिट्टी के बरतन बनाम प्लंबिंग जैसी चीजों के बारे में थोड़ा ओसीडी है, बस इतना ही।
मनोज गोविंदन

9
git rev-parse --verify <branch_name>टैग और प्रतिबद्ध हैश जैसे अन्य संदर्भों को भी सत्यापित करता है, इसलिए यदि आपको इसकी आवश्यकता है तो इसके लिए अधिक उपयुक्त हो सकता है यदि आप शाखाओं में केवल सटीक रुचि रखते हैं तो झूठी सकारात्मक वापसी करेंगे।
पॉल एस।

2
LOCAL शाखा मौजूद है या नहीं यह निर्धारित करने के लिए केवल गिट शो-रेफ काम कर रहा है। अपडेट में (git Rev-parse के साथ सिंटैक्स), रिमोट कोड से मिलान करने पर रिटर्न कोड भी 0 होता है।
फेबियन बुलो

जवाबों:


57

जहाँ तक मुझे पता है, यह एक स्क्रिप्ट में करने का सबसे अच्छा तरीका है। मुझे यकीन नहीं है कि इसमें जोड़ने के लिए बहुत कुछ है, लेकिन एक उत्तर भी हो सकता है जो कहता है कि "वह आदेश जो आप चाहते हैं वह सब कुछ करता है" :)

केवल एक चीज जिससे आप सावधान रहना चाहते हैं, वह यह है कि शाखा के नाम में आश्चर्यजनक चरित्र हो सकते हैं, इसलिए आप उद्धृत करना चाह सकते हैं <branch-name>


1
उद्धृत करने के बारे में अच्छी बात है <branch-name>। FWIW मैं एक फैब्रिक स्क्रिप्ट में इसका उपयोग कर रहा हूं। मैं चर को उद्धृत करना याद रखूंगा।
मनोज गोविंदन

सही उत्तर यह है कि यह स्पष्ट रूप से है: git show-ref --verify --quiet refs / heads / <branch-name> यह दिखाएगा कि HEAD सही ढंग से एक शाखा नहीं है। git Rev-parse --verify आपको बताएगा कि HEAD एक मौजूदा शाखा है। गलत क्योंकि HEAD एक शाखा नहीं है।
पॉलो नेव्स

106

जब मैं एक खोज इंजन पर 'git check if branch मौजूद है' के लिए खोज करता हूं, तो यह पृष्ठ वह पहला है जिसे मैं देखता हूं।

मुझे वह मिल जाता है जो मैं चाहता हूं, लेकिन मैं एक अद्यतन जवाब देना चाहूंगा क्योंकि मूल पोस्ट 2011 से थी।

git rev-parse --verify <branch_name>

यह अनिवार्य रूप से स्वीकृत उत्तर के समान है, लेकिन आपको "रेफ्स / हेड /" में टाइप की आवश्यकता नहीं है


20
बस एक नोट: git rev-parse --verifyकेवल आपको बताता है कि ऐसी कोई वस्तु रेपो में मौजूद है (अर्थात यह किसी भी मान के लिए 0 वापस आ जाएगी <branch_name>जो रेपो में किसी भी प्रकार की वस्तु में बदल जाती है)। यह आपको नहीं बताता है कि वह वस्तु एक शाखा है या नहीं।
तवानब

9
यह प्रश्न का सही उत्तर नहीं है, जो यह पूछ रहा है कि कैसे पता चले कि कोई शाखा मौजूद है या नहीं। यह आपको एक टैग के लिए एक झूठी सकारात्मक देगा। इसको आप खुद आसानी से परख सकते हैं। आपको उन टैग्स से अलग करने की आवश्यकता है, जो उन टैग्स से अलग हैं जो Refs / टैग्स में हैं, और यहां तक ​​कि refs / remotes में भी।
२०:३० पर एमएसथ

15
git Rev-parse - gh-pages मुझे देता है: घातक: एक ही संशोधन की आवश्यकता
SuperUberDuper

@SuperUberDuper आपने प्रयास किया: git rev-parse --verify ** मूल / ** gh- पृष्ठ?
RoyalBigMack

33

लगभग वहाँ पहुँच गया।

बस --verifyऔर बाहर छोड़ दो --quietऔर तुम या तो हैश अगर शाखा मौजूद है या कुछ भी नहीं अगर यह नहीं है।

इसे एक चर पर असाइन करें और एक खाली स्ट्रिंग के लिए जांचें।

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

10
वापसी मूल्य पर्याप्त है - आपको किसी चर को असाइन करने के संभावित त्रुटि-संभावित प्रयास से गुजरने की आवश्यकता नहीं है।
सुश्री मुंह

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
मनोज गोविंदन

3
@ मोमोज: मैं पोर्सिलेन बनाम प्लंबिंग के बारे में जानता हूं, लेकिन मैंने कभी नहीं पढ़ा था कि प्लंबिंग को पोर्सिलेन की तुलना में अधिक स्थिर माना जाता था। डॉक्स में मुझे इंगित करने के लिए धन्यवाद।
मार्क ड्रागो

गलती से टैग खोजने से बचने के लिए, और इस बारे में अधिक विशिष्ट होना कि क्या शाखा स्थानीय या दूरस्थ है, आप निर्दिष्ट कर सकते हैं git show-branch refs/heads/[branch]या git show-branch refs/remotes/origin/[branch]
Twasbrillig

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 कमांड का नामकरण थोड़ा wack tbh है
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



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मेटाचैकर के रूप में की जाती है।
पीटर जॉन एकलाम

1
यदि आप उस शाखा के लिए परीक्षण करते हैं, जिसका नाम वास्तविक शाखा का एक विकल्प है, तो आपको एक झूठी सकारात्मक भी मिलेगी। abcअगर वहाँ एक शाखा कहा जाता है जैसे मैच होगा abcdef
rjmunro

-1

स्क्रिप्ट में उपयोग के लिए, मैं निम्नलिखित कमांड की सिफारिश करता हूं:

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

ध्यान दें कि <repo_url>बस एक "हो सकता है।" स्थानीय रेपो निर्दिष्ट करने के लिए यदि आप इसकी निर्देशिका संरचना के अंदर हैं, तो एक स्थानीय रेपो का मार्ग, या दूरस्थ रेपो का पता।

यदि <branch_name>कोई 1 मौजूद नहीं है, तो कमांड 0 देता है ।


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

फिर रिटर्न मान की जाँच करें 0 या 1।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.