सभी शाखाओं को खींचने और धक्का देने के लिए गिट सेट करें


615

मैं डिफ़ॉल्ट रूप से सभी शाखाओं को धक्का और खींचना चाहता हूं, जिसमें नए बनाए गए शामिल हैं।

क्या ऐसी कोई सेटिंग है जिसे मैं इसके लिए परिभाषित कर सकता हूं?

अन्यथा, जब मैं एक नई शाखा जोड़ता हूं, तो स्थानीय रूप से और मैं इसे सर्वर से खींचना चाहता हूं, इसे करने का सबसे सरल तरीका क्या है?

मैंने उसी नाम से एक नई शाखा बनाई और खींचने की कोशिश की लेकिन यह काम नहीं करता है। शाखा के सभी दूरस्थ विन्यास के लिए मुझसे पूछता है। मैं इसे कैसे सेट करूं


4
"और खींचने की कोशिश की, लेकिन यह काम नहीं करता है"। विवरण कृपया। हमें बताएं कि आपने किस कमांड का उपयोग करने का प्रयास किया है।
जकूब नारबस्की

जवाबों:


1297

सबसे सरल तरीका है:

git push --all origin

यह टैग और शाखाओं को आगे बढ़ाएगा।


10
एसओ और अन्य स्थानों पर मुझे मिले दर्जनों उत्तरों के बीच, यह एक नई बनाई गई स्थानीय शाखा को धक्का देने का सबसे सरल तरीका है, कॉन्फ़िगरेशन को छूने के बिना। धन्यवाद!
एंड्रस ज़ेपेश्जी

174
और अगर आप -uएक बार जोड़ते हैं , उदाहरण के लिए git push --all origin -u, ट्रैकिंग सेटअप है और उसके बाद आप बस उपयोग कर सकते हैं git push
एलेक

23
Git संस्करण 1.7.12.3 के लिए मुझे git push --tags originसभी टैग्स को पुश करने के लिए उपयोग करना था ।
इसजेक

17
इसके अलावा "--mirror" को देखें - "all "के बजाय यह अधिक सामान को धक्का देता है
Loda

21
चेतावनी: यदि आपके पास LOCAL शाखाओं का एक समूह है, जिसे आपने साफ नहीं किया है (सुविधाएँ, हॉटफिक्स के) - या ठीक से साफ नहीं किया (मुझे), तो यह आपके रिमोट को बाढ़ कर देगा। अरे नहीं। और हमने सिर्फ एक प्रूनिंग की। यकीन नहीं होता कि मेरे लोकल में इतनी सारी शाखाएँ क्यों बची थीं।
जैक

147

आधुनिक Git के साथ आप हमेशा सभी शाखाओं लाने (में रिमोट ट्रैकिंग के रूप में शाखाओं refs/remotes/origin/*नाम स्थान, दृश्य के साथ git branch -rया git remote show origin)।

डिफ़ॉल्ट रूप से ( push.defaultकॉन्फिग चर के प्रलेखन देखें ) आप मिलान शाखाओं को धक्का देते हैं , जिसका अर्थ है कि पहले आपको git push origin branchइसे हमेशा धकेलने के लिए गिट के लिए करना होगा git push

यदि आप चाहते हैं सभी शाखाओं हमेशा पुश हैं , तो आप पुश रिफस्पेक सेट कर सकते हैं। यह मानते हुए कि रिमोट का नाम है originया तो आप git config का उपयोग कर सकते हैं :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

या सीधे .git/configफाइल को एडिट करने के लिए कुछ इस तरह से करें:

[दूरस्थ "मूल"]
        url = user@example.com: /srv/git/repo.git
        लाना = + refs / सिर / *: refs / remotes / मूल / *
        fetch = + refs / tags / *: refs / टैग / *
        धक्का = + refs / सिर / *: refs / सिर / *
        धक्का = + refs / टैग / *: refs / टैग / *

3
@ मेरक: git push --all originसभी शाखाओं और टैग को प्रकाशित करने के लिए एक समय के लिए अच्छा है, हालांकि वर्तमान संस्करण 'मिलान' शब्दार्थ तक डिफ़ॉल्ट रूप से इसका मतलब होगा कि आप सभी शाखाओं को बाद में धकेल देंगे ... जब तक आप नई शाखा या टैग नहीं जोड़ते। "पुश करने के लिए [...] डिफ़ॉल्ट रूप से सभी शाखाएं" की सेटिंग लिखित है।
जैकब नर:51बस्की

आप इस तरह से Git को फिर से कॉन्फ़िगर करने के तरीके को जोड़ने के उत्तर को बेहतर बना सकते हैं। यह उपयोगकर्ताओं को सरल मोड सेट करने के लिए उपयोगी है।
डेरेकसन

3
यह जीआईटी 2.0 से बदल गया है। पुश डिफ़ॉल्ट सरल है, किसी भी अधिक मेल नहीं खा रहा है।
माइक

मैंने यह कोशिश की और पुश पर एक त्रुटि मिली: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (नोट: मैं जीआईटी 2.0 पर हूं। मैं अभी भी इसे ठीक करने के लिए काम कर रहा हूं।)
ब्रायन लैसी

2
अब डिफ़ॉल्ट मान के लिए push.defaultहै simple
हैशांगफोरियन

32

पुश स्पेक में + को शामिल करना शायद एक बुरा विचार है, क्योंकि इसका मतलब है कि git ख़ुशी से बिना -f के भी तेज़ी से एक गैर-फास्ट-फ़ॉरवर्ड पुश करेगा , और यदि रिमोट सर्वर को उन लोगों को स्वीकार करने के लिए सेट किया गया है, तो आप इतिहास खो सकते हैं।

बस यह प्रयास करें:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

आप --globalइनमें से प्रत्येक को अपने सभी रिपॉजिटरी के लिए वैश्विक डिफ़ॉल्ट बनाने के लिए विकल्प भी जोड़ सकते हैं ।
ईथर

यह दुर्भाग्यपूर्ण है कि करते समय git द्वारा स्वचालित रूप से + जोड़ा जाता है git remote add
ईथर

25

मैंने नई रिपॉजिटरी में सभी शाखाओं को स्थानांतरित करने के लिए नीचे दिए गए आदेशों का उपयोग किया था।

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

नोट : मुझे दूसरे आखिरी (यानी पुश मास्टर फर्स्ट) कमांड का उपयोग करना पड़ा, जबकि एटलसियन स्टैश से एडब्ल्यूएस कोडोमिट (खाली रेपो) के लिए एक रेपो क्लोनिंग । मुझे कारण निश्चित नहीं है, लेकिन धकेलने के बाद ( git push new-origin --mirror) डिफ़ॉल्ट शाखा की तुलना में किसी अन्य शाखा का जिक्र था master


1
रेपो को दूसरे होस्ट के पास ले जाने के लिए बिल्कुल सही। धन्यवाद!
पेल्मेड

2
यह वास्तव में केवल उपयोगी विधि है। का प्रयोग करें git push new_origin --allबस, नहीं मूल की सभी शाखाओं new_origin के लिए अपने वर्तमान स्थानीय शाखाओं धक्का।
yanzi1225627

बस यह देखते हुए कि यह एक --bareरिपॉजिटरी बनाता है, जो एक नियमित रिपॉजिटरी से थोड़ा अलग है, इसमें केवल .gitफाइलें हैं, आपकी फाइलें नहीं। यदि आप इसमें काम नहीं करने जा रहे हैं तो यह पूरी तरह से पर्याप्त है। देखें --bareऔर --mirror git-scm.com/docs/git-clone करें
जम्मुत

हालाँकि, इसमें केवल .गित फाइलें हैं और वास्तविक स्रोत कोड नहीं है, यदि आप एक रिमोट अपडेट करते हैं तो यह मूल से गंतव्य तक सब कुछ फिर से लाएगा।
SanthoshM

यह एक जीवन रक्षक था! यह "मास्टर से पहले दर्पण" विधि ने बिटकबेट को गंतव्य के साथ तय किया और "मास्टर" के अलावा एक अलग शाखा पर विश्वास करना मुख्य शाखा थी।
टोड्डियस झोउ

12

यदि आप एक पुराने से एक नए रेपो में शाखाएं स्थानांतरित कर रहे हैं और सभी पुरानी रेपो शाखाएं स्थानीय नहीं हैं, तो आपको पहले ट्रैक करने की आवश्यकता होगी।

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

फिर अपना नया रिमोट रेपो जोड़ें:

git remote add bb <path-to-new-repo>

तब आप इस आदेश का उपयोग करके सभी को धक्का दे सकते हैं:

git push -u bb --all

या आप अन्य प्रतिक्रियाओं में नोट किए गए git config कमांड का उपयोग करके रेपो को कॉन्फ़िगर कर सकते हैं यदि आप यह एक बार नहीं कर रहे हैं या केवल स्थानीय शाखाओं को स्थानांतरित करने के लिए देख रहे हैं।

महत्वपूर्ण बिंदु, अन्य प्रतिक्रियाएं केवल सभी LOCAL शाखाओं को धक्का देती हैं। यदि शाखाएँ केवल एक वैकल्पिक REMOTE रिपॉजिटरी पर मौजूद होती हैं, तो वे पहले उन्हें ट्रैक किए बिना नहीं चलेंगी। यहां प्रस्तुत लूप के लिए मदद मिलेगी।


BTW, मैं यहां "मूल" के स्थान पर "bb" का उपयोग कर रहा हूं क्योंकि मुझे लगता है कि आपके मूल / पुराने भंडार को "मूल" नाम दिया गया था और संभवत: उस लेबल से जुड़ा हुआ है। "बीब" बिटबकेट के लिए है, जहां मैंने अपने मूल रेपो को स्थानांतरित कर दिया है, लेकिन यदि आप चाहें तो इसे "न्यूओरिजिन" की तरह लागू कर सकते हैं।
लांस क्लीवलैंड

2
यह मेरे लिए काम नहीं किया। सभी दूरस्थ शाखाओं के साथ एक ही स्थानीय शाखा पर नज़र रखने के साथ समाप्त: /
jhsowter

2
AFAIK यह @jhsowter टिप्पणी के अनुसार काम नहीं करना चाहिए। मेरे लिए एक नई शाखा में एक दूरस्थ शाखा को ट्रैक करने के लिए सही कमांड है, git branch --track reponame origin/reponameअन्यथा आप वर्तमान स्थानीय शाखा पर सभी दूरस्थ शाखाओं को ट्रैक करेंगे
पायनियर आसमान

मैंने रेपो-संग्रह स्निपेट को बदल दिया git branch -r | grep -v '\->' | sed 's/ origin\///', जो कि केवल दूरस्थ शाखा का नाम देता है।
पॉल हिक्स

6

git branch -aनिष्पादित करने वाली सभी शाखाओं को देखने के लिए आपको निम्नलिखित पर अमल करना चाहिए:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

अब आप सभी शाखाओं को देख सकते हैं:

git branch

सभी शाखाओं को आगे बढ़ाने के लिए प्रयास करें:

git push --all

1
λ git fetch
लंबा

क्या आप कोशिश कर रहे हैं git fetch --all?
तोखी

4

यदि आप सभी शाखाओं को एक पुराने से एक नए रेपो में ले जा रहे हैं, तो अपने स्थानीय रेपो में आपको नई रेपो को आगे बढ़ाने से पहले, मौजूदा ब्रांच की प्रत्येक शाखा पर नज़र रखने की आवश्यकता होगी, अन्यथा आपकी सभी मूल शाखाएँ इसमें दिखाई नहीं देंगी। नया मूल। प्रत्येक शाखा पर नज़र रखने या जाँच करके या एक लाइनर का उपयोग करके इसे मैन्युअल रूप से करें:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

यह एक पंक्ति कमांड इस पृष्ठ पर अन्य उत्तरों में इसके संस्करणों पर आधारित है, लेकिन यकीनन बेहतर है क्योंकि:

  1. यह इस पेज पर इस कमांड के कुछ पुराने वेरिएंट के विपरीत, शाखा ट्रैकिंग को सही ढंग से सेट करता है, जो केवल एक पैरामीटर को --track पर सप्लाई करता है और इस प्रकार प्रत्येक शाखा ट्रैकिंग मास्टर को समाप्त करती है - अच्छा नहीं
  2. उपसर्ग के बिना स्थानीय शाखाओं के नाम "मूल /" जो मैं व्यक्तिगत रूप से नहीं चाहता हूं - और जब आप किसी शाखा को सामान्य रूप से चेकआउट करते हैं तो उसके अनुरूप होता है।
  3. पहले से ही हो रहा है पर नज़र रखने वाले मास्टर
  4. वास्तव में कुछ भी चेकआउट नहीं है इस प्रकार तेज है
  5. गिट शाखा -r के उत्पादन में -> से अधिक ठोकर खाने से बचा जाता है

अगला, यदि आप मूल स्विच कर रहे हैं, तो पुराने मूल के लिंक को बदलें और एक नया रिमोट इंगित करें। सुनिश्चित करें कि आप पहले बिटबकेट / गितुब जीयूआई का उपयोग करके नया रिमोट बनाएं, लेकिन इसमें कोई फाइल न जोड़ें या मर्ज की समस्या होगी। उदाहरण के लिए

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

अब धक्का लगाओ। नोट दूसरी कमांड को टैग को पुश करने के लिए आवश्यक है:

git push -u --all origin
git push --tags origin

0

originविन्यास में हार्डकॉउट के बिना समाधान

अपने वैश्विक gitconfig में निम्नलिखित का उपयोग करें

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

यह सभी शाखाओं और सभी टैगों को आगे बढ़ाता है

आपको originकॉन्फ़िगरेशन में हार्डकोड क्यों नहीं करना चाहिए ?

यदि आप हार्डकोड:

  1. आप originसभी रेपो में रिमोट के रूप में समाप्त हो जाएंगे । तो आप मूल जोड़ने में सक्षम नहीं होंगे, लेकिन आपको उपयोग करने की आवश्यकता है set-url
  2. यदि कोई टूल किसी भिन्न नाम के साथ रिमोट बनाता है तो सभी कॉन्फिगर लागू नहीं होंगे। फिर आपको रिमोट का नाम बदलना होगा, लेकिन नाम काम नहीं करेगा क्योंकि originपहले से मौजूद है (बिंदु 1 से) याद रखें :)

आधुनिक गिट द्वारा पहले से ही लेटिंग का ध्यान रखा जाता है

जकुब नारबस्की के उत्तर के अनुसार:

आधुनिक git के साथ आप हमेशा सभी शाखाओं को प्राप्त करते हैं (रिमोट-ट्रैकिंग शाखाओं के रूप में refs / remotes / मूल / * नाम स्थान में

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