सभी git को पुश करने में सक्षम एक कमांड के साथ रिमोट?


195

करने के बजाय:

git push origin --all && git push nodester --all && git push duostack --all

वहाँ सिर्फ एक आदेश के साथ ऐसा करने का एक तरीका है?

धन्यवाद :)



allअपने सभी रिमूव को पुश करने के लिए रिमोट बनाने के लिए देखें: stackoverflow.com/a/18637593/802365
zdouard Lopez

जवाबों:


253

सभी शाखाओं को सभी रीमोट में धकेलने के लिए:

git remote | xargs -L1 git push --all

या यदि आप एक विशेष शाखा को सभी रीमोट में धकेलना चाहते हैं:

masterउस शाखा से प्रतिस्थापित करें जिसे आप पुश करना चाहते हैं।

git remote | xargs -L1 -I R git push R master

(बोनस) कमांड के लिए git उपनाम बनाने के लिए:

git config --global alias.pushall '!git remote | xargs -L1 git push --all'

रनिंग git pushallअब सभी शाखाओं को सभी रीमोट में धकेल देगा।


1
बहुत अच्छा और सरल उपाय। BTW आप -L 1 के बजाय xargs -l का उपयोग कर सकते हैं, -l विकल्प एक ही -L 1 के समान है। इसके अलावा, कभी-कभी मैं गिट पुश को भी जोड़ता हूं। git रिमोट | xargs -l git push --all
टोनी

2
मैं xargs: illegal option -- lOSX पर मिलता हूं । यह समझ से बाहर है, आप की जरूरत हैgit remote | xargs -L1 git push
balupton

4
Git आपको एक कस्टम कमांड में कॉल करने की अनुमति देता है। बस इसे एक फ़ाइल में रखें जो 1) आपके पथ पर है, 2) आपके पास अनुमतियाँ निष्पादित हैं, और 3) जिसे "git- [कस्टम नाम]" कहा जाता है (जैसे git-foo, git-push-all) और आप बस "git [कस्टम नाम]" टाइप करने में सक्षम हो (जैसे git foo, git push-all)।
एंड्रयू मार्टिन

2
@ उबंटू पर, man xargsकहते हैं कि विकल्प -lपदावनत है क्योंकि यह POISX कल्पना में नहीं है।
वेजेंड्रिया

2
@kyb git उर्फ ​​सिंटैक्स में, !निम्नलिखित का अर्थ आंतरिक गिट कमांड नहीं है, बल्कि एक बाहरी शेल कमांड है।
कमजोर

285

allइसके नाम से कई रेपो URL के साथ रिमोट बनाएं :

git remote add all origin-host:path/proj.git
git remote set-url --add all nodester-host:path/proj.git
git remote set-url --add all duostack-host:path/proj.git

फिर बस git push all --all


यह इस तरह दिखता है .git/config:

  [remote "all"]
  url = origin-host:path/proj.git
  url = nodester-host:path/proj.git
  url = duostack-host:path/proj.git

5
सुपर कूल ट्रिक! एकमात्र नुकसान यह है कि यह दूरदराज के प्रमुखों को स्थानांतरित नहीं करता है। git fetch --allइस तरह के पुश करने के बाद आपको सही दौड़ना होगा।
मैडहेड

8
श्री टॉर्वाल्ड्स (गिट के निर्माता) का उल्लेख है कि वह इस पद्धति का उपयोग करते हैं, लेकिन वे कहते हैं कि यह सुविधा के लिए है और कोई तकनीकी लाभ नहीं देता है marc.info/?l=git&m=116231242118202&w/2/2 और अंत में, यहां तक ​​कि "एक" git push "जो कि कई रिपॉजिटरी को धक्का देता है, वह वास्तव में प्रत्येक रिपॉजिटरी के लिए एक बार कनेक्ट करने से समाप्त हो जाएगा, इसलिए यह वास्तव में मल्टीपल" git पुश "करने के लिए सिर्फ एक शॉर्टहैंड है। कोई वास्तविक तकनीकी लाभ नहीं है, बस एक सुविधा है।"
मैट

14
इस दृष्टिकोण के साथ एक समस्या यह है कि आपको उपलब्ध होते ही नए URL को allरिमोट से जोड़ना git remote | xargs -L1 git push --allहोगा , जबकि स्वचालित रूप से कोई नया रीमेक तैयार होगा।
रफी खाचदौरेन

2
युक्ति: allजब भी आप एक प्रतिबद्ध भेजते हैं, तो टाइपिंग की आवश्यकता नहीं है , बस "मूल" का उपयोग "सभी" के बजाय करें:git remote set-url --add origin nodester-host:path/proj.git
मैकाबूस

पुश url सेट git pushकरना न भूलें अन्यथा सभी url अपडेट नहीं होंगे। तदनुसार अपडेट किया गया
user3338098

88

यदि आप हमेशा repo1, repo2 और repo3 पर धकेलना चाहते हैं, लेकिन हमेशा केवल repo1 से खींचते हैं, तो दूरस्थ 'मूल' को सेट करें

[remote "origin"]
    url = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo2
    pushurl = https://exampleuser@example.com/path/to/repo3
    fetch = +refs/heads/*:refs/remotes/origin/*

कमांड लाइन पर कॉन्फ़िगर करें:

$ git remote add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo2
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo3

यदि आप केवल से पुल करना चाहते हैं repo1, लेकिन धक्का repo1और repo2 एक विशिष्ट शाखा के लिएspecialBranch :

[remote "origin"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[remote "specialRemote"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[branch "specialBranch"]
    remote = origin
    pushRemote = specialRemote
    ...

Https://git-scm.com/docs/git-config#git-config-branchltnamegtremote देखें ।


4
मुझे यकीन नहीं है कि इसे अधिक वोट क्यों नहीं मिले। यह वास्तव में वास्तव में सुविधाजनक है क्योंकि यह आपको git pushबिना किसी तर्क के बस करने की अनुमति देता है।
हस्की

1
मेरे लिए वोट करें, कृपया!
मेंग लू

1
यह मुझे ऐसा करने के लिए अधिक उपयुक्त तरीका लगता है। सबसे ज्यादा वोट चाहिए था।
अहमद

यह बहुत उपयोगी है। क्या केवल मास्टर शाखा में पुष्पलता को सीमित करना संभव है?
fbucek

17

.It / config फ़ाइल को संपादित करने के लिए CLI वैकल्पिक के रूप में, आप निम्न आदेशों का उपयोग कर सकते हैं:

# git remote add all origin-host:path/proj.git
# git remote set-url --add all nodester-host:path/proj.git
# git remote set-url --add all duostack-host:path/proj.git

यहाँ भी वही git push all --allकाम करता है।

आपने उत्तर # 1 के समान ही पूरा किया है। आपने इसे केवल विन्यास फाइल के कच्चे संपादन के बजाय कमांड लाइन के साथ किया है।


2

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

यह आपके .bashrc या .bash_profile में जोड़ा जा सकता है।

function GitPush {
  REMOTES=$@

  # If no remotes were passed in, push to all remotes.
  if [[ -z "$REMOTES" ]]; then
    REM=`git remote`

    # Break the remotes into an array
    REMOTES=$(echo $REM | tr " " "\n")
  fi

  # Iterate through the array, pushing to each remote
  for R in $REMOTES; do
    echo "Pushing to $R..."
    git push $R
  done
}

उदाहरण: मान लीजिए कि आपके रेपो में 3 रीमोट हैं: रेम 1, रेम 2 और रेम 3।

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

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