सवाल गिट में सभी रिमोट शाखाओं को कैसे क्लोन करें?


मेरे पास एक master और ए development शाखा, दोनों धक्का दिया GitHub। मैंने cloneघ, pullएड, और fetchएड, लेकिन मैं इसके अलावा कुछ भी पाने में असमर्थ रहता हूं master वापस शाखा

मुझे यकीन है कि मुझे कुछ स्पष्ट याद आ रहा है, लेकिन मैंने मैनुअल पढ़ा है और मुझे कोई खुशी नहीं मिल रही है।


3560
2017-09-15 22:42


मूल


यहां स्वीकृत उत्तर (git branch -a) आपको रिमोट में शाखाएं दिखाता है, लेकिन यदि आप उनमें से किसी को भी जांचने का प्रयास करते हैं तो आप 'अलग-अलग सिर' राज्य में होंगे। अगला उत्तर नीचे (दूसरा सबसे ऊपर उठाने वाला) एक अलग प्रश्न का उत्तर देता है (बुद्धि के लिए: सभी शाखाओं को कैसे खींचें, और फिर, यह केवल उन लोगों के लिए काम करता है जिन्हें आप स्थानीय रूप से ट्रैक कर रहे हैं)। कई टिप्पणियों से पता चलता है कि आप पार्स कर सकते हैं git branch -a एक शेल स्क्रिप्ट के साथ परिणाम जो स्थानीय रिमोट शाखाओं को स्थानीय रूप से ट्रैक करेंगे। सारांश: जो भी आप चाहते हैं उसे करने के लिए कोई गिट मूल तरीका नहीं है और यह वैसे भी इतना अच्छा विचार नहीं हो सकता है। - Day Davis Waterbury
हो सकता है कि पूरे फ़ोल्डर को पुराने तरीके से कॉपी करें? scp some_user@example.com:/home/some_user/project_folder ~ यकीन नहीं है कि यह समाधान हालांकि जिथूब के लिए काम करता है .. - snapfractalpop
कहने के बजाय "मैंने क्लोन किया है, खींच लिया है, और लाया है," हमें दिखाने के लिए बहुत बेहतर है सटीक आदेश आपने निष्पादित किया - Bob Gilmore
यह हमेशा मुझे चकित करता है क्यों "क्लोन" एक सटीक प्रति के भाव में नहीं है। यदि यह एक सटीक क्लोन है, तो क्या सभी शाखाएं स्थानीय भंडार का हिस्सा नहीं बननी चाहिए? मेरा मतलब है कि वितरित होने के बिंदु में से एक नहीं है? तो जब कुछ भंडार खत्म हो जाता है तो आपके पास अभी भी सब कुछ की एक पूर्ण प्रति है। या क्या यह तथाकथित "रिमोट" वास्तव में स्थानीय भंडार का हिस्सा है? - huggie
सभी उपरोक्त उत्तरों, उत्तरों, उत्तरों पर टिप्पणियां और विचारों की दिमाग-दबाने वाली संख्या को देखते हुए, मुझे लगता है कि यह समय गिट ने ऐसा करने के लिए एक आदेश जोड़ा है। और ठीक है आप @ huggie हैं, मेरे विचार बिल्कुल। - Sнаđошƒаӽ


जवाब:


सबसे पहले, एक रिमोट क्लोन Git भंडार और सीडी इसे में:

$ git clone git://example.com/myproject
$ cd myproject

इसके बाद, अपने भंडार में स्थानीय शाखाओं को देखें:

$ git branch
* master

लेकिन आपकी भंडार में छिपी हुई अन्य शाखाएं हैं! आप इनका उपयोग कर देख सकते हैं -a झंडा:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

यदि आप सिर्फ अपस्ट्रीम शाखा में त्वरित झलक लेना चाहते हैं, तो आप इसे सीधे देख सकते हैं:

$ git checkout origin/experimental

लेकिन अगर आप उस शाखा पर काम करना चाहते हैं, तो आपको स्थानीय ट्रैकिंग शाखा बनाना होगा जो स्वचालित रूप से किया जाता है:

$ git checkout experimental

और तुम देखोगे

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

वह आखिरी पंक्ति कुछ लोगों को फेंकता है: "नई शाखा" - हुह? इसका वास्तव में क्या अर्थ है कि शाखा को इंडेक्स से लिया गया है और आपके लिए स्थानीय रूप से बनाया गया है। पिछला रेखा वास्तव में अधिक जानकारीपूर्ण है क्योंकि यह आपको बताती है कि शाखा को दूरस्थ शाखा को ट्रैक करने के लिए स्थापित किया जा रहा है, जिसका आमतौर पर मूल / शाखा_नाम शाखा का अर्थ है

अब, यदि आप अपनी स्थानीय शाखाओं को देखते हैं, तो आप यही देखेंगे:

$ git branch
* experimental
  master

आप वास्तव में एक से अधिक दूरस्थ भंडार का उपयोग कर ट्रैक कर सकते हैं git remote

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

इस बिंदु पर, चीजें बहुत पागल हो रही हैं, तो भागो gitk यह देखने के लिए कि क्या हो रहा है:

$ gitk --all &

4024
2017-09-16 13:28



कोई स्वचालित रूप से सभी दूरस्थ शाखाएं कैसे बना सकता है, उदा। मूल / प्रयोगात्मक के लिए प्रयोगात्मक? - Cristian Ciupitu
क्रिस्टियन: मैं हमेशा प्रत्येक शाखा 'मूल / foo' के लिए एक शाखा 'foo' बनाना चाहता था, लेकिन इससे दो समस्याएं हुईं: (1) मैं वास्तव में बहुत सी स्टेल ट्रैकिंग शाखाओं के साथ घायल हो गया था जो कई संबंधित रिमोट शाखा के पीछे थे , और (2) गिट के पुराने संस्करणों में, 'गिट पुश' चलाना, मेरी सभी स्थानीय शाखाओं को रिमोट पर धकेलने का प्रयास करेगा, भले ही उन शाखाएं पुरानी हों। तो अब मैं केवल उन चीजों के लिए स्थानीय शाखाएं रखता हूं जिन्हें मैं सक्रिय रूप से विकसित कर रहा हूं, और अगर मुझे उनके बारे में जानकारी चाहिए तो मूल / * शाखाओं तक सीधे पहुंचें। (उस ने कहा, आप 'गिट शाखा-ए' को पार्स करने के लिए एक शेल स्क्रिप्ट का उपयोग कर सकते हैं।) - emk
"गिट फ़ेच <मूल-नाम> <शाखा-नाम>" शाखा को आपके लिए स्थानीय रूप से नीचे लाता है। - Orange Box
अच्छा जवाब है, लेकिन थोड़े सवाल को याद करते हैं। मैं सभी रिमोट शाखाओं की जांच करने के लिए एक लाइनर की तलाश में था। - cmcginty
प्रश्न सभी रिमोट शाखाओं को क्लोन करने के बारे में था, उन्हें जांच नहीं रहा था। और, जैसा कि मैंने ऊपर उल्लेख किया है, आप वास्तव में आवश्यकतानुसार कोई और स्थानीय ट्रैकिंग शाखा नहीं बनाना चाहते हैं, क्योंकि जब वे वास्तव में बासी हो जाते हैं, तो वे सिरदर्द का कारण बन सकते हैं। - emk


यदि आपके पास कई रिमोट शाखाएं हैं जिन्हें आप एक साथ लाने के लिए चाहते हैं, तो करें:

$ git pull --all

रिमोट रिपोजिटरी को मारने के बिना अब आप किसी भी शाखा को चेकआउट कर सकते हैं।


745
2018-01-13 16:42



अगर मैं गिट क्लोन करता हूं, तो मेरे पास स्थानीय शाखा है और 10 शाखाएं "रिमोट" हैं। तो गेबे द्वारा यह जवाब बहुत उपयोगी था और सवाल का जवाब देता था। - basZero
यह केवल दूरस्थ रिमोट शाखाएं लाता है जिन्हें स्थानीय रूप से जोड़ा नहीं गया है कोई रिमोट शाखा - jujule
पहला आदेश अनावश्यक है। केवल git pull --all वही करेगा - यह सिर्फ दो बार नहीं लाएगा। और infosec812 सही है कि यह वैसे भी सवाल का जवाब नहीं देता है। मुझे आश्चर्य है कि यह कितने अपवित्र हो गया। - Sven Marnach
मैंने किया के बाद git remote update, फिर कोशिश की git branch, मैं केवल स्थानीय शाखाओं को देखता हूं। लेकिन अगर मैं करता हूं git branch -a अब मैं रिमोट शाखाएं देख सकता हूं और मैं कर सकता हूं git pull <branchname> मैं चाहता हूं कि शाखा प्राप्त करने के लिए। - मैं इस प्रश्न पर Google खोज से उतरा, और यह जवाब मेरी समस्या हल करता है। - Jazzerus
यह बिल्कुल सहायक नहीं है, इसके अलावा किसी भी दूरस्थ शाखा को खींच नहीं है। - Avinash R


इस दे घुमा के लिपि ने मेरी मदद की:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

यह मास्टर को छोड़कर सभी दूरस्थ शाखाओं के लिए ट्रैकिंग शाखाएं बनाएगा (जो आपको मूल क्लोन कमांड से मिला है)। मुझे लगता है कि आपको अभी भी एक करने की आवश्यकता हो सकती है

git fetch --all
git pull --all

सुनिश्चित होना।

एक लाइन: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs सामान्य रूप से: आरएम-आरएफ ब्रह्मांड की प्रतिलिपि बनाने से पहले अपने सेटअप में परीक्षण करें क्योंकि हम इसे जानते हैं

एक लाइनर के लिए क्रेडिट उपयोगकर्ता सीएफआई पर जाते हैं


379
2018-01-21 02:18



यह वास्तव में एक आदर्श समाधान होने के करीब है .. केवल एक चीज जो इसे बेहतर बनाती है, अगर यह कार्यक्षमता गिट में एक विकल्प के रूप में अंतर्निहित थी। - Deven Phillips
"एक लाइन": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs   हमेशा की तरह: कॉपी करने से पहले अपने सेटअप में परीक्षण करें rm -rf universe as we know it - cfi
यह आदेश सामान्य शाखाओं (फ़ीचर शाखाओं नहीं) के रूप में रिमोट से फ़ीचर शाखाएं बनाता है - इसे कैसे ठीक किया जाए? - Alex2php
यदि आप शाखा नामों में "/" के साथ मुद्दों में भाग लेते हैं तो गिट उपनाम का उपयोग करके नीचे एक समाधान होता है। "15 मई 1313 को उत्तर दिया गया" 11:02 पर "कोई नहीं" द्वारा जवाब देखें - wemu
मैं बस ट्रिम कर रहा हूँ remotes/origin/ नामस्थानों को संरक्षित करने के लिए: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


का उपयोग करते हुए --mirror विकल्प कॉपी करने लगता है remote सही ढंग से शाखाओं को ट्रैक करना। हालांकि, यह भंडार को एक नंगे भंडार के रूप में स्थापित करता है, इसलिए आपको इसे बाद में सामान्य भंडार में बदलना होगा।

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

संदर्भ: गिट अकसर किये गए सवाल: मैं सभी दूरस्थ रूप से ट्रैक की गई शाखाओं के साथ एक भंडार कैसे क्लोन कर सकता हूं?


280
2017-08-27 17:49



आप जानते हैं कि यह वास्तव में एक अच्छा अच्छा जवाब प्रतीत होता है भले ही उसके पास कोई वोट न हो। क्या इस तरह से ऐसा करने के लिए कोई नुकसान है? मुझे उन आदेशों को चलाने के बाद स्पष्ट रूप से एक शाखा को चेकआउट करना पड़ा। - loop
यह गिट पुश --mirror के साथ संयुक्त है, जो कि github.com से github एंटरप्राइज़ इंस्टॉलेशन में जाने पर रिमोट गिट रेपो का सटीक डुप्लिकेट बनाने के लिए आवश्यक है। धन्यवाद! - Jacob Fike
@ डेव: एक फाइनल जोड़ें git checkout अंततः क्लोन रेपो पर मौजूदा शाखा के प्रमुख को चेकआउट करने के लिए अंतिम आदेश के रूप में। यह अब तक का सबसे अच्छा जवाब है। बहादुर बनें, अंततः हम आपको शीर्ष पर ले जाएंगे :-) - cfi
@ डेव: एचएम। मेरे पास दूसरे विचार हैं: --mirror ट्रैक की जा रही सभी शाखाओं को बस स्थापित करने से कहीं अधिक है। यह मूल और बाद में सभी रेफरी की प्रतिलिपि बनाता है git remote update फिर से ऐसा करेंगे। परिवर्तन खींचने का व्यवहार। मैं पूरी प्रतिलिपि पर विश्वास करने के लिए वापस आ गया हूं कि एक लाइन स्क्रिप्ट की आवश्यकता है। - cfi
git clone --mirror अपने गिट रिपॉजिटरीज का समर्थन करने के लिए बहुत अच्छा है ^ _ ^ - TrinitronX


आप फैंसी "गिट चेकआउट -बी कुछब्रैंच मूल / कुछब्रैंच" वाक्यविन्यास का उपयोग किए बिना आसानी से शाखा में स्विच कर सकते हैं। आप बस कर सकते हैं:

git checkout somebranch

गिट स्वचालित रूप से सही काम करेगा:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

गिट जांच करेगा कि एक ही नाम वाली शाखा बिल्कुल एक रिमोट में मौजूद है, और यदि ऐसा होता है, तो यह उसी तरह से ट्रैक करता है जैसे आपने स्पष्ट रूप से निर्दिष्ट किया था कि यह एक दूरस्थ शाखा है। गिट 1.8.2.1 के गिट-चेकआउट मैन पेज से:

यदि <शाखा> नहीं मिला है लेकिन इसमें एक ट्रैकिंग शाखा मौजूद है   एक मिलान नाम के साथ बिल्कुल एक रिमोट (इसे <दूरस्थ>) कहते हैं, के रूप में व्यवहार करें   के बराबर

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



तो, यदि आप शाखा का नाम checkout दूरस्थ शाखा के नाम के समान है, "/" के बाद सबकुछ, तो गिट उसी नाम की शाखा बनायेगा, सब कुछ "/", "ट्रैकिंग" के बाद रिमोट? और ट्रैकिंग करके, हमारा मतलब है: git push, git pull, आदि उस रिमोट पर किया जाएगा? यदि यह सही है, तो अधिक जानकारी के साथ अपने उत्तर पर विस्तार करें, क्योंकि मैं @ Daniel से सहमत हूं, यह उत्तर अधिक प्रतिनिधि के योग्य है। - Gerard Roche
@BullfrogBlues, आपके सभी प्रश्नों का उत्तर हाँ प्रतीत होता है (मैं गिट v1.7.7.4 का उपयोग कर रहा हूं)। मैं मानता हूं कि इस व्यवहार को बेहतर जाना चाहिए। (यह गिट के इस संस्करण के लिए मैनुअल में नहीं है।) मुझे वास्तव में यह व्यवहार पसंद नहीं है, मुझे एक त्रुटि मिलनी होगी और कहना होगा git checkout --track origin/somebranch स्पष्ट रूप से। - dubiousjim
@dubiousjim: वास्तव में, यह मैनुअल में है। गिट-चेकआउट (1) कहता है: "यदि <शाखा> नहीं मिला है लेकिन एक रिमोट में एक ट्रैकिंग शाखा मौजूद है (इसे <remote> पर कॉल करें) मिलान करने वाले नाम के साथ, 'गिट चेकआउट-बी <शाखा' के बराबर व्यवहार करें > --ट्रैक <रिमोट> / <शाखा> '"(गिट वी .1.8.1.1)। - sleske
हमें जो चाहिए वह $ गिट पुल * <रिमोट> / * - जहां "*" एक वाइल्डकार्ड है, इसलिए यह सभी शाखाओं को खींचता है, जिनमें अभी तक स्थानीय सिस्टम पर नहीं है। यह कैसे करना है? क्या हम वास्तव में हमारे स्थानीय सिस्टम में कोड खींचने के लिए हर शाखा को चेकआउट / खींचना चाहते हैं? - JosephK


के बारे में,

$ गिट चेकआउट -बी प्रयोगात्मक उत्पत्ति / प्रयोगात्मक

का उपयोग करते हुए

$ git checkout -t origin/experimental

या अधिक verbose लेकिन याद रखना आसान है

$ git checkout --track origin/experimental

रिमोट रिपोजिटरी को ट्रैक करने के मामले में बेहतर हो सकता है।


88
2017-07-27 06:10





जो काम आप कर रहे हैं उसे सभी रिमोट शाखाएं मिलनी चाहिए, लेकिन यह उनके लिए स्थानीय शाखाएं नहीं बनाएगी। यदि आप गिटक का उपयोग करते हैं, तो आपको "रिमोट / मूल / देव" या कुछ समान के रूप में वर्णित दूरस्थ शाखाएं देखना चाहिए।

रिमोट शाखा के आधार पर स्थानीय शाखा बनाने के लिए, कुछ ऐसा करें:

गिट चेकआउट -बी देव रेफ / रिमोट / मूल / देव

जो कुछ इस तरह वापस करना चाहिए:

रिमोट शाखा रिफ / रिमोट / मूल / देव को ट्रैक करने के लिए शाखा देव की स्थापना की गई।
एक नई शाखा "देव" के लिए स्विच

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


77
2017-09-15 22:52



आपको यहां रेफ / रिमोट की आवश्यकता नहीं है। गिट चेकआउट -बी देव मूल / देव ठीक काम करेगा। - emk
यह हमेशा काम करेगा: git checkout -b newlocaldev --track origin/dev। यदि आप चाहते हैं कि स्थानीय शाखा का रिमोट एक जैसा नाम है, और रिमोट के पास कोई मुश्किल नाम नहीं है, तो आप इसे छोड़ सकते हैं -b newlocaldev। डिफ़ॉल्ट के साथ branch.autosetupmerge कॉन्फ़िगरेशन सेटिंग, और यह मानते हुए कि आपके पास नाम की एक स्थानीय शाखा नहीं है dev, ये दो आदेश एक ही काम कर सकते हैं: git checkout -b dev origin/dev और सिर्फ सादा git checkout dev। आखिरकार, git checkout origin/dev एक नई शाखा नहीं बनाती है, लेकिन आपको अलग-अलग सिर राज्य में डाल देती है। - dubiousjim
क्या होता है जब रिमोट अब मौजूद नहीं है लेकिन गिट बहुत ही बेवकूफ है इसे स्वीकार करने के लिए स्वीकार्य है? यह आपको अद्यतन करता है और git branch -a एक रिमोट शाखा के रूप में इसे सूचीबद्ध करना जारी रखता है। - jww
और हम इसे दर्जनों शाखाओं के लिए करते हैं? - JosephK


जब आप "गिट क्लोन गिट: // स्थान" करते हैं, तो सभी शाखाएं और टैग लाए जाते हैं।

एक विशिष्ट रिमोट शाखा के शीर्ष पर काम करने के लिए, यह मानते हुए कि यह मूल रिमोट है:

git checkout -b branch origin/branchname

57
2017-09-15 22:47



मैं आपके नोट की सराहना करता हूं "सभी शाखाएं और टैग लाए जाते हैं"। मैं आपके जवाब पर गलत होने पर टिप्पणी करने जा रहा था, लेकिन फिर मैंने इसे चेक किया और पाया, आप बिल्कुल सही हैं। तो एक तरह से, आपने सबसे छोटा जवाब दिया है - अगर आपने क्लोन किया है, तो आपके पास पहले से ही है। अच्छा लगा। कोई जोड़ने की कोशिश कर सकता है: कोशिश करें $ git branch -a सीखने के लिए, कौन सी रिमोट शाखाएं पहले से ही उपलब्ध हैं। - Jan Vlcinsky


उपनाम का प्रयोग करें। यद्यपि कोई मूल गिट एक-लाइनर नहीं है, आप स्वयं को परिभाषित कर सकते हैं

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

और उसके बाद इसका उपयोग करें

git clone-branches

46
2018-05-15 11:02