git उथला क्लोन (क्लोन - ddthth) दूरस्थ शाखाओं को याद करता है


98

रिमोट रिपॉजिटरी की क्लोनिंग के बाद यह किसी भी रिमोट ब्रांच को -a विकल्प नहीं दिखाता है। क्या समस्या हो सकती है? इसे डीबग कैसे करें? इस स्निपेट में दो दूरस्थ शाखाओं को नहीं दिखाया गया है:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

एक ही मशीन पर एक ही कमांड की कोशिश की, यह अच्छी तरह से काम करता है:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

एक और रेपो क्लोनिंग की कोशिश की, यह अच्छी तरह से काम करता है। हालाँकि मैं इसे दोबारा इस मशीन पर आज़मा सकता हूँ, लेकिन यह जानना बेहतर होगा कि क्या गलत है।

किसी भी सुझाव या संकेत का स्वागत से अधिक होगा।

संपादित करें: उत्तर सारांश: चूंकि git संस्करण 1.8.3.2 "-depth" और "--no-single-branch" को पहले जैसा व्यवहार प्राप्त करने के लिए एक साथ उपयोग करने की आवश्यकता है। इसे बग फिक्स माना जाता है।


3
masterआपकी स्थानीय शाखा है। remotes/origin/masterइसी दूरस्थ शाखा है। वास्तव में सवाल क्या है?
michas

1
क्या आप शायद वाचालता को भूल गए? कोशिश करेंgit branch -avv
jthill

माइकल्स आदि के लिए: हम आमतौर पर मास्टर को एक शाखा के रूप में संदर्भित नहीं करते हैं, भ्रम के लिए खेद है। जोड़ा "दो दूरस्थ शाखाओं को नहीं दिखाया गया है"। को शांत करना: याद दिलाने के लिए धन्यवाद, आप सही हैं।
मिंगहुआ

1
शुरू करने के लिए धन्यवाद git clone --depth=1 --no-single-branch, यह वही है जो मुझे ज्यादातर मामलों में चाहिए।
अलीरज़ा मोहम्मदी

जवाबों:


63

व्यवहार सही है, अंतिम संशोधन के बाद मास्टर-शाखा है (क्योंकि यह प्राथमिक रिमोट का हेड है) रिपॉजिटरी में एकमात्र रिमोट-शाखा है:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

पूर्ण क्लोन नई (सभी) शाखाएँ प्रदान करता है:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

उथला क्लोन

तकनीकी दस्तावेज़ीकरण में उथले-वर्णन के कारण , एक " git-clone --depth 20 repo[...] परिणाम [में] 20 से कम की लंबाई के साथ श्रृंखलाबद्ध करता है।" एक उथले क्लोन में शाखा की नोक से, कमिट्स की अनुरोधित गहराई होनी चाहिए।

के रूप में - इसके अलावा - दत्तक ग्रहण के git cloneलिए प्रलेखन का --single-branchवर्णन है:

"केवल एकल इतिहास की ओर जाने वाले इतिहास को क्लोन करें, या तो --branchविकल्प द्वारा निर्दिष्ट या प्राथमिक शाखा रिमोट के HEADबिंदुओं पर निर्दिष्ट करें । विकल्प के साथ उथले क्लोन बनाते --depthसमय, यह डिफ़ॉल्ट है, जब तक --no-single-branchकि पास के इतिहास को लाने के लिए नहीं दिया जाता है। सभी शाखाओं के सुझाव। "

इसलिए एक उथले क्लोन ( साथ गहराई -option) केवल हासिल करेगा केवल एक ही शाखा (आपके अनुरोध गहराई पर)।


दुर्भाग्य से दोनों विकल्प ( --depthऔर --single-branch) अतीत में दोषपूर्ण रहे हैं और उथले क्लोनों का उपयोग अनसुलझे समस्याओं को बताता है (जैसा कि आप ऊपर पोस्ट किए गए लिंक में पढ़ सकते हैं), जो दिए गए इतिहास-पुनर्लेखन के कारण होता है। यह विशेष मामलों में कुछ हद तक जटिल व्यवहार की ओर जाता है।


1
florianb: आपका git संस्करण क्या है? इसे आज़माने के लिए धन्यवाद। मैंने १..1.१ पर १-१ वें स्थान पर किया था, अब यह सभी दूरस्थ शाखाओं को दर्शाता है। इससे सवाल अपडेट किया। समस्या के सत्यापन के लिए +1।
मिंगहुआ

1
@minghua: मैं १..4.४ का उपयोग कर रहा हूं - अगर उस मुद्दे पर कोई पैच था तो मैं थोड़ी जांच करूंगा।
फ्लोरियन ब्रेकिस

1
@minghua: "एडजस्टेड क्लोन" के बारे में नए निष्कर्षों को प्रतिबिंबित करने के लिए मैंने संपादित किया।
फ्लोरियन ब्रेकिस

1
यह केवल एक चीज को छोड़कर लगभग सही है: "रेपो-मालिक ने अन्य शाखाओं को बंद करने का फैसला किया" यह कहने से क्या मतलब है? मुझे लगता है कि वे शाखाएँ अभी भी हैं।
मिंगहुआ

2
-नहीं-एकल-शाखा भी सभी टैग क्लोन करती है। हम एक नया रेपो बनाकर, एक ही कॉन्फिगर का उपयोग करके सभी रीमेक, यानी fetch = +refs/heads/*:refs/remotes/origin/*, और रनिंग git fetch --depth 1(बिना --tags) प्राप्त कर सकते हैं। हम कॉन्फ़िगर जैसे टैग का उपयोग करके विशिष्ट टैग जोड़ सकते हैं fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0
सैम वाटकिंस

205

उथले क्लोन करने के बाद , दूरस्थ से अन्य शाखाओं की जांच करने में सक्षम होने के लिए ,

  1. रन (साभार @jthill):

    git remote set-branches origin '*'
    
  2. उसके बाद, ए git fetch -v

  3. आखिरकार git checkout the-branch-i-ve-been-looking-for


चरण 1 को मैन्युअल रूप से संपादित करके भी किया जा सकता है .git/config

उदाहरण के लिए, फ़ोलोइंग लाइन को निम्न से बदलें:

fetch = +refs/heads/master:refs/remotes/origin/master

(के masterसाथ बदलें *):

fetch = +refs/heads/*:refs/remotes/origin/*

57
आप git remote set-branches origin '*'सभी शाखाओं के लिए भी उपयोग कर सकते हैं , *एक के लिए एक शाखा के साथ बदल सकते हैं ।
jthill

धन्यवाद! इससे मेरा दिन बच गया।
स्टीवन जू

में क्या -vvvमतलब है git fetch -vvv? मुझे इसके बारे में कोई जानकारी नहीं मिली है git-fetch doc
guo

@ इसके लिए यह verbosityया debugलॉगिंग स्तर के लिए है git। यह fetchविधि से नहीं है ।
Marlo

1
@ kawing-chiu यह उपयोगी है यदि आपके पास इतनी शाखाएँ हैं और आकार पहले 'इंटरनेट कनेक्शन' के लिए बड़ा है और अब उन सभी शाखाओं को प्राप्त करने का जोखिम उठा सकते हैं। :)
Marlo

61

@Jthill से प्रतिक्रियाओं और टिप्पणी को पढ़ने से, मेरे लिए सबसे अच्छी बात यह थी set-branchesकि git remoteकमांड पर विकल्प का उपयोग करना था :

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

यह नामित रिमोट द्वारा ट्रैक की गई शाखाओं की सूची में परिवर्तन करता है ताकि हम केवल आवश्यक शाखा को ला सकें और चेकआउट कर सकें।


15
यह उपयोग करने के लिए बेहतर हो सकता है git remote set-branches --add origin 'remote_branch_name'ताकि नई शाखा मौजूदा लोगों के अतिरिक्त हो, बल्कि उन्हें .git / config फ़ाइल में लाने के लिए दूरस्थ शाखाओं की सूची (या शाखा पैटर्न) में प्रतिस्थापित किया जाए।
dumbledad

2
OMG, एकल उद्धरण 'महत्वपूर्ण हैgit remote set-branches --add origin 'remote_branch_name'
सप्ताहांत

@ मैं इस काम को तब तक पूरा नहीं कर सका, जब तक कि मैं एकल उद्धरण नहीं
छोड़ता

@ पांडा आप शायद विंडोज पर हैं। उत्तर में "$" चिन्ह का अर्थ है बैश (यूनिक्स या साइगविन / MSYS पर)।
योंगवेई वू

डॉक्स में एकल उद्धरण आवश्यक होने के बारे में मुझे कुछ भी नहीं दिखता है और यह कम से कम macOS पर एक के बिना ठीक काम करता है।
निकोले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.