अगर किसी दूरस्थ रिमोट रिपॉजिटरी पर दूरस्थ शाखा मौजूद है तो कैसे जांचें?


106

मुझे एक विशिष्ट शाखा के लिए एक सबट्री मर्ज करने की आवश्यकता है, अगर यह किसी दिए गए दूरस्थ रिपॉजिटरी पर मौजूद है। समस्या यह है कि दूरस्थ रिपॉजिटरी की स्थानीय स्तर पर जांच नहीं की जाती है, इसलिए मैं इसका उपयोग नहीं कर सकता git branch -r। मेरे पास एक दूरस्थ पता है, कुछ इस तरह से https://github.com/project-name/project-name.git। क्या एक दूरस्थ पते से दूरस्थ शाखाओं को सूचीबद्ध करने का कोई तरीका है? मुझे कुछ भी उपयोगी नहीं मिला :(

जवाबों:


124
$ git ls-remote --heads git@github.com:user/repo.git branch-name

मामले branch-nameमें पाया जाता है कि आप निम्न आउटपुट प्राप्त करेंगे:

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

अन्यथा कोई आउटपुट नहीं भेजा जाएगा।

तो यह पाइपिंग wcआपको देगा 1या 0:

$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l

वैकल्पिक रूप से आप उस --exit-codeझंडे को सेट कर सकते हैं git ls-remoteजिस पर 2कोई मिलान नहीं होने की स्थिति में निकास कोड वापस आ जाएगा । यह सबसे मुहावरेदार समाधान है। परिणाम को सीधे शेल परीक्षण में या स्थिति चर की जाँच करके देखा जा सकता है $?

$ git ls-remote --exit-code --heads  git@github.com:user/repo.git branch-name

7
मैंने git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/nullif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
सिबज़

1
मैं कुछ घंटों के लिए इस शानदार और सटीक जवाब की तलाश कर रहा था, शानदार।
माध्य

आपको शाखा का नाम निर्दिष्ट करना होगा /refs/heads/branch-name। अन्यथा, foo/branch-nameजब कोई नहीं है तब भी शाखा वापस कर दी जाएगी branch-name
फजी

आपके 'ग्रेट जवाब' गोल्ड बैज पर बधाई। :)
jmort253

4
नोट: यदि आप रेपो URL निर्दिष्ट नहीं करना चाहते हैं, तो आप इसके बजाय रेपो रिमोट नाम निर्दिष्ट कर सकते हैं, जैसे:git ls-remote --heads origin branch-name
daveruinseverything

50
git ls-remote --heads https://github.com/rails/rails.git
5b3f7563ae1b4a7160fda7fe34240d40c5777dcd    refs/heads/1-2-stable
81d828a14c82b882e31612431a56f830bdc1076f    refs/heads/2-0-stable
b5d759fd2848146f7ee7a4c1b1a4be39e2f1a2bc    refs/heads/2-1-stable
c6cb5a5ab00ac9e857e5b2757d2bce6a5ad14b32    refs/heads/2-2-stable
e0774e47302a907319ed974ccf59b8b54d32bbde    refs/heads/2-3-stable
13ad87971cc16ebc5c286b484821e2cb0fc3e3b1    refs/heads/3-0-stable
3df6c73f9edb3a99f0d51d827ef13a439f31743a    refs/heads/3-1-stable
f4db3d72ea564c77d5a689b850751ce510500585    refs/heads/compressor
c5a809e29e9213102351def7e791c3a8a67d7371    refs/heads/deps_refactor
821e15e5f2d9ef2aa43918a16cbd00f40c221e95    refs/heads/encoding
8f57bf207ff4f28fa8da4544ebc573007b65439d    refs/heads/master
c796d695909c8632b4074b7af69a1ef46c68289a    refs/heads/sass-cleanup
afd7140b66e7cb32e1be58d9e44489e6bcbde0dc    refs/heads/serializers

मुझे ls- रिमोट के बारे में भी नहीं पता था। धन्यवाद!
कीन

7
मुझे बैश स्क्रिप्ट में एक परीक्षण करने की आवश्यकता थी और इसलिए केवल वास्तव में बाहर निकलने के कोड में दिलचस्पी थी, इसलिए मैंने निम्नलिखित एक स्थानीय क्लोन में किया: git ls-remote --exit-code . origin/branch-name &> /dev/nullफिर $?परीक्षण ऑपरेटर के रूप में उपयोग किया गया
डैरेन बिशप

5
@ डेरेन, केवल कमांड को सीधे एक सशर्त में उपयोग करना, जैसा कि if git ls-remote ...; then ...; fi, जाँच की तुलना में कम त्रुटि वाला है $?(जिसे लॉगिंग स्टेटमेंट, ट्रैप आदि के द्वारा बदला जा सकता है)।
चार्ल्स डफी

क्यों --heads?
स्टीव

@ जॉनलाइन --headsकेवल शाखाओं को सूचीबद्ध करता है। --tagsकेवल टैग को सूचीबद्ध करने के लिए उपयोग करें।
रिओमो

19

एक और तरीका है कि आप वर्तमान फ़ोल्डर में उपयोग कर सकते हैं यदि यह चलाने के लिए गिट रेपो है

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'

2
दोहरे उद्धरण चिह्नों का उपयोग करें:git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
इवान

3
यह इष्टतम नहीं है क्योंकि यह तब भी सही होगा जब आप केवल एक मौजूदा शाखा के नाम से मेल खाते हों, लेकिन लक्ष्य शाखा से बिल्कुल मेल नहीं खाते। इसलिए यह जांचने के लिए किसी स्क्रिप्ट में सुरक्षित रूप से उपयोग नहीं किया जा सकता है कि क्या शाखा इसकी जांच करने से पहले मौजूद है। वैसे भी साझा करने के लिए धन्यवाद, क्योंकि मुझे यह उपयोगी लगा। इस तरह तय किया जा सकता है:git branch -a | grep "\b${BRANCH}$"
EntangledLoops

2
git fetchयदि आवश्यक हो git branch -aतो सभी रीमोट रेफ्स को पहले इस्तेमाल किया जाता है। अन्य git ls-remoteद्वारा बताए अनुसार उपयोग करें ।
hIpPy

git branch -a --list '<pattern>'एक विकल्प भी है। अगर आपको अपनी स्क्रिप्ट के लिए रिटर्न कोड की आवश्यकता है तो grep पर जाएं।
LOAS

17

आप इसका उपयोग भी कर सकते हैं:

git show-branch remotes/origin/<<remote-branch-name>>

$ का नवीनतम प्रतिफल और मूल्य देता है? क्या 0 अन्यथा रिटर्न "घातक: खराब sha1 संदर्भ रीमोट / उत्पत्ति / <>" और $ का मूल्य है? 128 है


यह जाँच से पहले रिमोट से शाखाएँ नहीं खींचेगा, इसलिए आपको नवीनतम दूरस्थ स्थिति नहीं मिलेगी।
०४:२६ में ०४ सेमेन्को

11

आप बैश टर्मिनल में ऐसा कुछ कर सकते हैं। बस इको को उन कमांड्स से बदलें जिन्हें आप निष्पादित करना चाहते हैं।

if git ls-remote https://username:password@github.com/project-name/project-name.git | grep -sw "remote_branch_name" 2>&1>/dev/null; then echo "IT EXISTS..START MERGE" ; else echo "NOT FOUND" ; fi

आशा करता हूँ की ये काम करेगा।


1
मुझें यह पसंद है। दूसरों के जवाब में भी एलएस-रिमोट है, जो मुझे पसंद है वह "यदि" है।
स्टोनी

11

फिर हर बार रिपॉजिटरी नाम को मैन्युअल रूप से पास करने की आवश्यकता नहीं है।

git ls-remote origin <branch>

के बजाय

git ls-remote <full repo url> <branch>

उदाहरण :

git ls-remote git@bitbucket.org:landmarkgroupme/in-store-application.git  uat_21dec

या

git ls-remote origin uat_21dec

दोनों एक ही आउटपुट देंगे:

यहां छवि विवरण दर्ज करें

उत्पत्ति पर अधिक : Git में "रीमोट्स" की अवधारणा है, जो आपके रिपॉजिटरी की अन्य प्रतियों के URL मात्र हैं। जब आप एक और रिपॉजिटरी को क्लोन करते हैं, तो गिट स्वचालित रूप से "मूल" नामक रिमोट बनाता है और इसे इंगित करता है। आप git दूरस्थ शो उत्पत्ति टाइप करके रिमोट के बारे में अधिक जानकारी देख सकते हैं।


11

यहां सभी उत्तर लिनक्स शेल-विशिष्ट हैं, जो बहुत मदद नहीं करते हैं यदि आप एक ऐसे वातावरण में हैं जो उन प्रकार के कार्यों का समर्थन नहीं करता है - उदाहरण के लिए, विंडोज कमांड कमांड।

सौभाग्य से git ls-remoteएक --exit-codeतर्क स्वीकार करता है जो शाखा के मौजूद होने या न होने के आधार पर 0 या 2 देता है। इसलिए:

git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>

0, और वापस आ जाएगी

git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>

2 लौटेंगे।

PowerShell के लिए, आप बस अंतर्निहित सत्यता से निपटने के शब्दार्थ का उपयोग कर सकते हैं:

if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }

पैदावार $true, जबकि:

if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }

पैदावार $false


6
$ git ls-remote --heads origin <branch> | wc -l

ज्यादातर समय काम करता है।

लेकिन काम नहीं करेगा यदि शाखा आंशिक रूप से नीचे से मेल खाती है,

$ git branch -a
creative/dev
qa/dev

$ git ls-remote --heads origin dev | wc -l
2

उपयोग

git ls-remote --heads origin <branch> | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^<branch>$ | wc -l

यदि आप एक विश्वसनीय तरीका चाहते हैं।

यदि आप स्क्रिप्ट में उपयोग करना चाहते हैं और originतब डिफ़ॉल्ट रिमोट के रूप में ग्रहण नहीं करना चाहते हैं

git ls-remote --heads $(git remote | head -1) "$branch" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^"$branch"$ | wc -l

कार्य करना चाहिए।

ध्यान दें कि git branch -a | grep ...यह विश्वसनीय नहीं है क्योंकि यह अंतिम fetchचलने के बाद थोड़ी देर हो सकती है ।


मेरे लिए, यह स्वीकृत उत्तर है, जो जेम्स कैशे ( grep -x "$branch"यह समान है grep ^"$branch"$) के साथ संयुक्त अमितेश (लघु दूरस्थ नाम) के साथ संयुक्त है । हालांकि लिपियों में मैं लंबे रूप के स्विच पसंद करता हूँ --line-regexp:। इसके अलावा, करने की कोई जरूरत नहीं है wc -l। बैश में खाली आउटपुट डालना if [ -z ] प्रभावी रूप से एक सच्चे के रूप में मूल्यांकन करता है तो इसका मतलब है कि शाखा मौजूद नहीं है। यह आपको कुछ मिलीसेकंड बचाता है।
अमेडी वैन गैससे

1

आप एक दूरस्थ उपयोग के रूप में आपके पास रिपॉजिटरी जोड़ सकते हैं git remote add something https://github.com/project-name/project-name.gitऔर फिर एक कर सकते हैंgit remote show something रिमोट के बारे में सभी जानकारी प्राप्त करने के लिए कर सकते हैं। इसके लिए नेटवर्क कनेक्शन की आवश्यकता होती है और यह मानव उपयोग के लिए उपयोगी है।

वैकल्पिक रूप से, ए git fetch something। यह रिमोट नामक सभी शाखाओं को लाएगा somethingऔर उन्हें आपके स्थानीय भंडार में रखेगा। फिर आप कृपया उन्हें अपनी स्थानीय शाखा में मिला सकते हैं। मैं इस पथ की सिफारिश के बाद से यदि आप अंत में फैसला आपको लगता है कि है मर्ज करने के लिए, यह आप क्या करने की जरूरत है।

OT: "स्थानीय रूप से चेक आउट" का आपका उपयोग इंगित करता है कि आप इसे केंद्रीकृत संस्करण नियंत्रण प्रणाली के दृष्टिकोण से देख रहे हैं। यह आमतौर पर एक मृत अंत है जब आप गिट के साथ काम कर रहे हैं। यह "चेकआउट" आदि जैसे शब्दों का उपयोग करता है कि पुराने सिस्टम ने कैसे किया।


स्पष्टीकरण के लिए धन्यवाद। मुझे अभी तक इसकी आदत नहीं है, और इसके लिए अलग तरीके की सोच की आवश्यकता है।
कीन

1

तुम कोशिश कर सकते हो

git diff --quiet @{u} @{0}

यहाँ @{u}दूरस्थ / अपस्ट्रीम @{0}को संदर्भित करता है , और वर्तमान स्थानीय HEAD को संदर्भित करता है (git के नए संस्करण के साथ, @{0}इसे छोटा किया जा सकता है @)। यदि रिमोट मौजूद नहीं है, तो यह त्रुटिपूर्ण है।

2.16.2 git के साथ (मुझे यकीन नहीं है कि किस संस्करण में यह कार्यक्षमता है, उदाहरण के लिए, git 1.7.1 के पास यह नहीं है), आप कर सकते हैं

git checkout

यदि एक दूरस्थ शाखा मौजूद है, तो कुछ आउटपुट होंगे, जैसे

Your branch is up to date with 'origin/master'

अन्यथा कोई आउटपुट नहीं है।


1

उन सभी शाखाओं (दूरस्थ या स्थानीय) को लौटा देगा जिनमें नाम में क्वेरी है।

git branch --all | grep <query>


0

यदि आपकी शाखा के नाम बहुत विशिष्ट हैं, तो आपको सरल शाखा नाम मिलान के लिए grep का उपयोग करने की आवश्यकता नहीं हो सकती है:

git ls-remote --heads $(git remote | head -1) "*${BRANCH_NAME}*" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    wc -l

जिसके लिए काम करता है

BRANCH=master
BRANCH=mas
BRANCH=NonExistingBranch (returns 0)
BRANCH=ISSUE-123

हम शाखा नाम के रूप में यूनीक इश्यू आईडी का उपयोग करते हैं और यह ठीक काम करता है।


0

मैंने अभी यह कोशिश की:

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

यह 1 वापस आ जाएगी यदि शाखा "आपकी शाखा" पाई जाती है और 0 अन्यथा।


0

मैं ऊपर दिए गए कुछ उत्तर एक स्क्रिप्ट में जोड़ रहा हूँ:

BRANCHES=(develop master 7.0 7.0-master)
ORIGIN=bitbucket
REMOTE=github

for BRANCH in "${BRANCHES[@]}"; do
  BRANCH=$(git ls-remote --heads "${ORIGIN}" "${BRANCH}" \
      | cut --delimiter=$'\t' --fields=2 \
      | sed 's,refs/heads/,,' \
      | grep --line-regexp "${BRANCH}")
  if [ -n "${BRANCH}" ]
  then
    git branch --force "${BRANCH}" "${ORIGIN}"/"${BRANCH}"
    git checkout "${BRANCH}"
    git push "${REMOTE}" "${BRANCH}"
  fi
done

git push github --tags

इस स्क्रिप्ट को एक दूरस्थ बिटबकेट से 4 शाखाएँ मिलेंगी, और उन्हें एक दूरस्थ गितुब में धकेलेंगी, और फिर सभी टैग्स को गितुब में धकेल देंगी। मैं जेनकींस की नौकरी में इसका उपयोग कर रहा हूं, इसीलिए आपको कोई भी git fetchया नहीं दिख रहा हैgit pull , जो जेनकिंस जॉब रिपॉजिटरी कॉन्फिगरेशन में पहले से ही है।

मैं आमतौर पर स्क्रिप्ट्स में लंबे समय से फॉर्म के विकल्प पसंद करता हूं। मैं संयुक्त git branchऔर git checkoutउपयोग कर सकता है git checkout -B

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