कई दूरस्थ स्थानों से पुल / पुश


743

संक्षिप्त: वहाँ एक तरीका है एक git रेपो धक्का है और दूरस्थ रेपो (एक "मूल" के बजाय) की सूची से खींचने के लिए)?

लंबे समय: मेरे पास अक्सर ऐसी स्थिति होती है जब मैं कई कंप्यूटरों में एक ऐप विकसित कर रहा हूं, अलग-अलग कनेक्टिविटी के साथ - एक पारगमन पर एक लैपटॉप कहो, एक कंप्यूटर "ए", जबकि मैं एक निश्चित स्थान पर हूं, और दूसरा कंप्यूटर "बी" जबकि दूसरे पर। इसके अलावा, लैपटॉप में केवल "ए" या "बी" के साथ कनेक्टिविटी हो सकती है, और कभी-कभी दोनों।

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


39
2016 के रूप में नए आगंतुकों, के लिए नोट: इस, प्रथम श्रेणी द्वारा मंजूर करने के लिए वर्तमान में-सही तरीका gitसुविधाओं, में शामिल है malvineous के नीचे इस सवाल का जवाब । स्वीकृत उत्तर गलत है।
ELLIOTTCABLE

@Zorzella: क्या आप इस पर स्वीकृत उत्तर को अपडेट कर सकते हैं, यह थोथा है जिस तरह से यह वर्तमान में भ्रमित है।
ntninja

जवाबों:


503

आप कई दूरस्थ रिपॉजिटरी को git remoteकमांड से कॉन्फ़िगर कर सकते हैं :

git remote add alt alt-machine:/path/to/repo

सभी कॉन्फ़िगर किए गए रीमोट से प्राप्त करने और ट्रैकिंग शाखाओं को अपडेट करने के लिए, लेकिन मर्ज नहीं करें HEAD, करें:

git remote update

यदि यह वर्तमान में किसी एक रीमोट से कनेक्ट नहीं है, तो यह समय निकाल देगा या किसी त्रुटि को फेंक देगा, और अगले पर जा सकता है। आपको cherry-pickएकत्रित रिपॉजिटरी से मैन्युअल रूप से मर्ज करना होगा, या , यह इस बात पर निर्भर करेगा कि आप किस तरह से बदलावों को व्यवस्थित करना चाहते हैं।

मास्टर शाखा को पूरी तरह से लाने के लिए और उसे अपने वर्तमान सिर में खींचने के लिए, करें:

git pull alt master

तो वास्तव git pullमें लगभग शॉर्टहैंड है git pull origin HEAD(वास्तव में यह निर्धारित करने के लिए यह कॉन्फिग फाइल में दिखता है, लेकिन आपको यह विचार मिलता है)।

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


तो आप जो कह रहे हैं कि "git Remote add foo ssh: //foo.bar/baz" एक शॉर्टहैंड फ़ॉर्म बनाता है, लेकिन मुझे अभी भी "गिट पुल" के साथ उन पर लूप करने की ज़रूरत है, या "गिट" के साथ उन पर लूप करें। मर्ज "(एक" गिट हटाओ अपडेट "के बाद यहां क्या वाक्यविन्यास है?) क्या यह शॉर्टहैंड नाम" गिट पुश "के लिए भी काम नहीं करेगा? Ie I can "git push foo" आदि (लूप)? धन्यवाद
Zorzella

8
"गिट पुल" मूल रूप से "गिट भ्रूण" है जिसके बाद "गिट मर्ज" होता है। "git रिमोट अपडेट" बस आपके लिए "git fetch" कॉल का एक गुच्छा करता है। तो जो बचता है वह है "git मर्ज" बिट। आप "git मर्ज उत्पत्ति / मास्टर" कह सकते हैं और यह मूल के मास्टर संस्करण को आपके वर्तमान HEAD में मर्ज कर देगा। "गिट पुल ओरिजिनल मास्टर" यही काम करता है, हालांकि यह पहले एक भ्रूण करेगा (और यदि आपने पहले से ही git रिमोट अपडेट किया है, तो इसे लाने के लिए और कुछ नहीं होगा, इसलिए यह बेमानी है)। हां, आप कह सकते हैं "git push foo" और यह सभी मिलान शाखाओं को "foo" नामक रिमोट तक पहुंचाएगा।
अरकनिद

IIUC आप एक काम करने वाले भंडार में नहीं धकेल सकते हैं (आखिरकार आप असंगत / अनपेक्षित / अवांछित परिवर्तनों को आगे बढ़ा सकते हैं)। हमें नंगे रिपोजिटरी में धकेलना चाहिए, और जब हम खींचते हैं तो केवल अपडेट प्राप्त करते हैं। तो समाधान के लिए प्रत्येक मशीन पर एक काम और एक नंगे भंडार की आवश्यकता होती है?
joeytwiddle 6

2
जाहिरा तौर पर आप कई
रिपोज के

797

आधुनिक संस्करणों के साथ मैन्युअल रूप से ऐसा करना अब आवश्यक नहीं है git! नीचे देखें माल्विनस का समाधान।

यहां प्रस्तुत है:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

मूल उत्तर:

यह कुछ है जो मैं काफी समय से खराब परिणामों के बिना उपयोग कर रहा हूं और गिट मेलिंग सूची पर लिनुस टॉर्वाल्ड्स द्वारा सुझाया गया है ।

araqnid का समाधान आपके रिपॉजिटरी में कोड लाने के लिए उचित है ... लेकिन जब आप, मेरी तरह, एक से अधिक समतुल्य आधिकारिक अपस्ट्रीम हैं (मैं अपनी कुछ अधिक महत्वपूर्ण परियोजनाओं को एक निजी अपस्ट्रीम, GHHub, और Codaset दोनों के लिए क्लोन करता हूं), यह हर दिन, हर एक को परिवर्तन धकेलने के लिए दर्द हो सकता है।

छोटी कहानी, git remote addआपके सभी व्यक्तिगत रूप से ... और फिर git config -eएक विलय। रिमोट जोड़ें। मान लें कि आपके पास यह भंडार है config:

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

... के लिए एक विलय a रिमोट बनाने के लिए "Paws"और "Codaset", मैं उन सभी के बाद निम्नलिखित जोड़ सकते हैं:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

एक बार जब मैंने यह कर लिया है, जब मैं git push Origin Master, यह दोनों Paws/Masterऔर Codaset/Masterक्रमिक रूप से धक्का देगा , जिससे जीवन थोड़ा आसान हो जाएगा।


104
git config -e.git/configअपने पसंदीदा संपादक में फ़ाइल खोलता है ।
रिचर्ड

3
शायद ज़रुरत पड़े। यह पुष्टि करते हुए कि 2 urls के साथ रिमोट अभी भी 1.7.12.4 को काम करता है। धन्यवाद।
फोब्बर

26
मैंने "मूल" रिमोट "सभी" का नाम दिया, इसे थोड़ा क्लीनर शब्दार्थ देने के लिए
ErichBSchulz

1
@JamesWomack @ माल्विनस का जवाब, नीचे देखें। अब यह "अधिक सही" है, क्योंकि gitकमांड-लाइन मूल रूप से इस का समर्थन करती है git remote set-url ... --add
ELLIOTTCABLE

1
[branch "Master"]सेट के तहत remote = Originऔर git pullदोनों रीमोट का उपयोग करेगा।
Bengt

264

चिट 1.8 (अक्टूबर 2012) के बाद से आप इसे कमांड लाइन से करने में सक्षम हैं:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

उसके बाद git pushuser1 @ repo1 पर पुश करेंगे, फिर user2 @ repo2 पर पुश करें।


19
मैं इस समाधान के खिलाफ दृढ़ता से सलाह देता हूं। हमने इसे अपनी कंपनी में उपयोग किया है और एक रिपॉजिटरी में विफल रहने वाले हुक के साथ गंभीर समस्या में चले गए हैं, लेकिन दूसरे पर नहीं। तब परिवर्तन केवल एक रिपॉजिटरी में मौजूद थे।
माइकल Schmei Michaeler

4
@ MichaelSchmeißer: संभवतः आप त्रुटि संदेशों को देख सकते थे, हालांकि समस्या को ठीक कर सकते हैं, फिर एक स्वच्छ स्थिति में सब कुछ वापस पाने के लिए फिर से धक्का दें?
मालवीयस

7
समस्या यह है कि अस्वीकार किए गए पुश को ठीक करने में उन कमिटों को बदलना शामिल है जिन्हें पहले से ही अन्य रेपो में धकेल दिया गया है। इसलिए, यदि कोई व्यक्ति पहले से ही उन कामों पर आधारित है, जो तय किए गए समय तक आते हैं, तो चीजें वास्तव में खराब हो जाती हैं, जो हमारे कार्यालय में मामला था।
माइकल श्मीयर

9
आह हाँ, यह मुश्किल हो सकता है। हालांकि मेरे लिए जो हुक की तरह लगता है उसे फिर से डिजाइन करने की आवश्यकता है। एक असफल धक्का सामान्य रूप से गिट को नहीं तोड़ता है, इसलिए विफलता का एक नया बिंदु पेश करना (जो आपको निफ्टी गिट सुविधा का उपयोग करने से भी रोकता है) शायद सबसे अच्छा समाधान नहीं है। निश्चित रूप से मैं यह जानता हूं कि आपकी आवश्यकताएं क्या हैं, यह जानने के लिए ...
माल्विनस

3
नहीं। मेरा प्रश्न लिखने के बाद से, मैंने अन्य वेब पोस्टिंग पढ़ी हैं और फिर इस चीज़ का परीक्षण किया है। अन्य पोस्टिंग पढ़ने से, मुझे यह संदेह हो गया है कि केवल पहली पंक्ति का उपयोग किया जाता है। मैंने अभी इसका परीक्षण किया है: वास्तव में, पहली पंक्ति के केवल URL का निरीक्षण किया गया है git fetch। (इसे देखते हुए, मुझे समझ में नहीं आता कि इसके git remote set-url --addबिना क्या उद्देश्य हो सकता है --push।)
imz - Ivan Zakharyaschev

34

मैंने इन उपनामों को अपने ~ / .bashrc में जोड़ा:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

6
यह कमाल का है! मैंने एक git config alias.pushall '!for i in ; do git push $i; done;'
गित

मुझे लगता है कि मैं एक नया रिमोट बनाने के लिए उपनाम समाधान पसंद करता हूं। यह भी देखें stackoverflow.com/questions/41372919/…
donquixote

1
छोटा सुझाया गया ट्वीक:alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'
स्कॉट सी विल्सन

25

आप के साथ remotes जोड़ सकते हैं:

git remote add a urla
git remote add b urlb

फिर सभी रेपो अपडेट करने के लिए:

git remote update

15

यहाँ मेरा उदाहरण .gitconfigउपनाम खंड के अंदर बैश स्क्रिप्ट के साथ है

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

7

मैंने .git कोन्गफिग फ़ाइल में रिमोट "ओरिजिनल" में दो अलग-अलग पुस्सर जोड़े। जब मैं दौड़ूंगा git push origin "branchName"तब यह प्रत्येक url तक जाएगा और आगे बढ़ेगा। निश्चित नहीं है कि इसे पूरा करने का एक आसान तरीका है, लेकिन यह खुद के लिए जीथब स्रोत कोड को पुश करने और एक ही समय में My.visualStudio स्रोत कोड पर पुश करने के लिए काम करता है।

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

4

मैंने उत्तर को गैर-urb से विस्तार करने के लिए लिया ; बस इसे अपने ~ / .bashrc में जोड़ें:

git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }    
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

उपयोग:

git-pullall master

git-pushall master ## or
git-pushall

यदि आप गिट-पुलॉल के लिए कोई शाखा तर्क प्रदान नहीं करते हैं, तो गैर-डिफ़ॉल्ट रीमोट से पुल विफल हो जाएगा; इस व्यवहार को वैसा ही छोड़ दिया, जैसा कि इसके अनुरूप है।


3

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

फ़ेच और भी जटिल है, और मैं इसे रैखिक रूप से करने की सलाह दूंगा।

मुझे लगता है कि आपका सबसे अच्छा जवाब एक बार मशीन है कि हर कोई एक धक्का / खींचने के लिए है, अगर यह संभव है।


2
समस्या यह है, जैसा कि मैंने वर्णन किया है, कोई केंद्रीय हमेशा उपलब्ध बॉक्स नहीं है। अगर मुझे एक लूपिंग बैश स्क्रिप्ट लिखनी है, तो वह बन जाए, लेकिन यह मज़ेदार लगता है कि एक वितरित वीसी मुझे यहां और अधिक मदद नहीं करेगा ...
जोर्जेला

2
वितरित किया जा रहा है, यह मानता है कि हर कोई उपलब्ध नहीं है, या धक्का दिया जाना चाहता था। यह अलग-अलग राज्यों में होने वाली विभिन्न रिपॉजिटरी से भी संबंधित है, और यह धारणा कि अन्य लोग उन पर समवर्ती कार्य कर रहे हैं। रिपॉजिटरी के सेट से आप जो धक्का देते हैं और खींचते हैं, वह विभिन्न रिपॉजिटरी की स्थिति को प्रभावित करता है, और आपको उन सभी को सही मायने में सिंक करने के लिए कई पास बनाने होंगे। यही कारण है कि कोई "पुल / पुश ऑल" नहीं है। फिर संघर्ष है ...;)
जेफ फेरलैंड

3

रीमोट्स (यानी pullकेस) अपडेट करने के लिए , चीजें आसान हो गई हैं।

लिनस का बयान

अफसोस की बात है, यह भी एक नकली उपनाम के साथ इस नकली करने के लिए कोई रास्ता नहीं है।

दीर्घवृत्त के उत्तर में Git मेलिंग सूची में संदर्भित प्रविष्टि अब सही नहीं है।

git fetch--allपिछले कुछ समय में सभी रीमोट को प्राप्त करने की अनुमति देने वाले पैरामीटर को एक बार में सीखा ।

यदि सभी से अनुरोध नहीं किया जाता है, तो --multipleकई रिमूव या समूह को निर्दिष्ट करने के लिए स्विच का उपयोग किया जा सकता है ।


3

मैं वीएसओ / टीएफएस में काम करना चाहता था, फिर तैयार होने पर गीथहब को सार्वजनिक रूप से धक्का दिया। प्रारंभिक वीटो निजी वीएसओ में बनाया गया। जब GitHub को जोड़ने का समय आया तो मैंने किया:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master

एक विजेता की तरह काम किया ...

एक पवित्रता की जाँच के लिए, "git Remote -v" जारी करें, जो किसी प्रोजेक्ट से जुड़े रिपॉजिटरी को सूचीबद्ध करने के लिए है।

C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v
githubrepo      https://github.com/jhealy/kinect2.git (fetch)
githubrepo      https://github.com/jhealy/kinect2.git (push)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)

सरल तरीका है, मेरे लिए काम किया ... आशा है कि यह किसी की मदद करता है।


4
git push -fबिना कारण के दौड़ना , जैसे असफलता git pushया यह जानना कि कोई क्या कर रहा है, एक बुरा विचार है जो संभावित रूप से हानिकारक है। यह भी सवाल का जवाब नहीं है, लेकिन एक दूसरे रिमोट को कैसे जोड़ा जाए।
कार्ल रिक्टर

2

वैश्विक gitconfig (/home/user/.gitconfig) नीचे दिए गए आदेश के साथ एक उपनाम जोड़ें।

git config --global alias.pushall '!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f'

एक बार जब आप कोड करते हैं, तो हम कहते हैं

जोर का धक्का

मूल रूप से मूल के लिए पुश करने के लिए। उपरोक्त उपनाम के बाद, हम कह सकते हैं

git पुशल

और कोड को रिमोट रिमोट सहित सभी रीमोट में अपडेट किया जाएगा।


1

allरिमोट जोड़ना थोड़ा थकाऊ हो जाता है क्योंकि आपको प्रत्येक मशीन पर सेटअप करना पड़ता है जो आप उपयोग करते हैं।

इसके अलावा, bashऔर git उपनामों ने यह मान लिया है कि आपके पास सभी रीमोट को धक्का होगा । (Ex: मेरे पास एक कांटा है sshagकि मैं GitHub और GitLab पर बनाए रखता हूं। मेरे पास अपस्ट्रीम रिमोट जोड़ा गया है, लेकिन मेरे पास इसे पुश करने की अनुमति नहीं है।)

यहाँ एक git उपनाम है जो केवल एक पुश URL के साथ रीमोट करता है जिसमें शामिल है @

psall    = "!f() { \
    for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
    git push $R $1; \
    done \
    }; f"

-3

नया रिमोट जोड़ना

git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv

कई स्थानों का निर्माण करें

git fetch --all

स्थानों पर पुश करें

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