Git पुश शाखा एक रिमोट से दूसरे में?


133

मेरे पास निम्नलिखित उपाय हैं:

$ git remote 
korg
rorg

और निम्नलिखित शाखाएँ:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

अब मैं से सभी दूरस्थ शाखाओं पुश करने के लिए इच्छा korgके लिए rorgदूरदराज के। मैं उसको कैसे करू?

अधिमानतः प्रत्येक पहले के लिए एक स्थानीय शाखा बनाने के बिना, अगर वह परिहार्य है।


मैं यह अनुमान लगा रहा हूं कि इसका उत्तर इस एक के उत्तर के बराबर है: stackoverflow.com/questions/6922700/…
लेगोलस

जवाबों:


52

कुछ अस्थायी रिपॉजिटरी बनाने वाली एक त्वरित परीक्षा से पता चलता है कि आप एक रिफस्पेक्ट का निर्माण कर सकते हैं जो यह कर सकता है:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

इसलिए मूल / BRANCHNAME: refs / heads / BRANCHNAME

मेरे rorgरिमोट में जाँच :

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
इसके बजाय git push rorg origin/one:one(बिना refs/heads/) क्यों नहीं ?
अली

2
@exalted क्योंकि refs/heads/आप उपसर्ग के साथ रिमोट ब्रॉन्च कर रहे हैं जिसे चेकआउट करने की आवश्यकता नहीं हैone
ДМИТРИИ МАЛИКОВ

@patthoyts मैंने उल्लेखित कमांड की कोशिश की, यह सब कुछ आज तक कहता है, लेकिन मेरी दूरस्थ ए में 10 शाखाएं हैं और दूरस्थ बी में 6 शाखाएं हैं तो क्या आप मुझे बता सकते हैं कि मैं बाईं ओर की शाखाओं को कैसे स्थानांतरित कर सकता हूं?
केशव १२३४

219

मुझे यह मिल गया है:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

और इसने मेरी सभी दूरस्थ शाखाओं को korg से rorg (यहां तक ​​कि शाखाओं की स्थानीय प्रतियों के बिना) में धकेल दिया। नीचे उत्पादन देखें:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

और फिर आप tagsरिफल्स के लिए एक ही पुश कर सकते हैं :

git push rorg 'refs/tags/*:refs/tags/*'

2
गिट के नए पर्याप्त (क्या संस्करण?) में, यह स्वीकृत उत्तर होना चाहिए। @ bjarke-freund-hansen यदि आप भावी खोजकर्ताओं के लाभ के लिए सहमत हैं तो क्या आप स्वीकार किए गए उत्तर को बदलना चाहेंगे?
जोनाह ग्राहम

1
"नए पर्याप्त में (क्या संस्करण?) Git का, यह स्वीकृत उत्तर होना चाहिए" जैसा कि मुझे पता है, यह हर सार्वजनिक git संस्करण के लिए काम करना चाहिए, क्योंकि उन लोगों के हस्ताक्षर और संदर्भ वाइल्डकार्ड सामान्य हैं
21

3
Everything up-to-dateकुछ भी नहीं होने के साथ मुझे git 2.10.0 पर देता है , जबकि व्यक्तिगत शाखाओं पर समान काम करता है।
user239558

6
बस मैंने सोचा कि मुझे इसे कॉल करना चाहिए: यह विधि रिमोट नामक एक वास्तविक शाखा बनाने के लिए लगती है HEAD। लेकिन वह हटाया जा सकता है। git push rorg :HEAD
मार्क स्टिकले

1
कोई भी रेफरी संरचना से परिचित नहीं है और सोच रहा है कि टैग कैसे धकेलें, आप यह कमांड चाहते हैं git push rorg refs/tags/*:refs/tags/*:। जो जैसा है, वैसा है git push rorg --tags, लेकिन यह समझना अच्छा है कि ये चीजें क्या कर रही हैं :)
मार्क स्टिकले

14

Patthoyt के उत्तर के पूरक के लिए , यहाँ एक छोटी शेल स्क्रिप्ट है जो सभी शाखाओं को एक रिमोट से दूसरे में धकेलती है:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

संक्षेप करने के लिए, स्रोत रिमोट पर प्रत्येक दूरस्थ शाखा के लिए (HEAD जैसी "पॉइंटर" शाखाओं को छोड़कर), गंतव्य रिमोट को रेफरी करें। ( ${a//$SRC_REMOTE\/}बिट शाखा के नाम से स्रोत रिमोट नाम को स्ट्रिप्स करता है, अर्थात, origin/masterबन जाता है master।)


3
हम में से उन लोगों के लिए जो इसे एक धक्का देने की जरूरत है:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen


0

आपके द्वारा चलाए जा रहे किसी भी स्क्रिप्ट के लिए, यह आपके सभी परिवर्तनों को छिपाने या प्रतिबद्ध करने के लिए बुद्धिमान होगा।

मुझे कई शाखाओं को एक रिमोट से दूसरे में पहुंचाने की जरूरत थी। इन उत्तरों के लिए आवश्यक था कि पहले स्थानीय शाखाएँ मौजूद थीं

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

बस मूल 1 को सोर्स रिमोट में बदलें, और ओरिजिन 2 को डेस्टिनेशन रिमोट में बदलें। इसे "RemoteBranchCloner.sh" में कॉपी करें और "sh callBranchCloner.sh" का उपयोग करके इसे कॉल करें।

एक बेहतर तरीका हो सकता है , जो कई धक्का नहीं देता है।

यदि आप मेरे कोड का उपयोग करते हैं, तो आप संभवतः क्रेडेंशियल कैशिंग का उपयोग करना चाहते हैं , अन्यथा आपको अपना क्रेडेंशियल सर्वरल टाईप करना होगा।

खिड़कियों के लिए :

नोट: यह लिपि लिनक्स के लिए है । यदि आप इसे "गिट बैश" में चलाते हैं, तो स्क्रिप्ट काम करेगी, लेकिन आप इसे कुछ विशेष स्थापित किए बिना देशी कंसोल से नहीं चला सकते।

git config [--global] credential.helper wincred

लिनक्स के लिए

git config [--global] credential.helper cache

जहाँ [--global] का अर्थ वैकल्पिक रूप से --global जोड़ना है

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

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

एक .sh फ़ाइल के रूप में संग्रहीत और "sh filename.sh" के साथ चलाया गया जो दूरस्थ 'रीमेकन' को ट्रैक करने के लिए सभी अपस्ट्रीम सेट करेगा


0

HEADपिछले उत्तर में बनाई जा रही अतिरिक्त शाखा के कारण , मुझे ऐसा करने का सबसे साफ तरीका नंगे रिपॉजिटरी में क्लोन करना है और फिर सभी शाखाओं को रिमोट की तरह धकेलना है:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.