सभी शाखाओं और टैग सहित नए रिमोट पर स्थानीय गिट रेपो को पुश करें


551

मेरे पास एक स्थानीय गिट रेपो है जिसे मैं एक नए रिमोट रेपो (बीनस्टॉक पर स्थापित नया रेपो, अगर वह मायने रखता है) पर धकेलना चाहूंगा।
मेरे स्थानीय रेपो में कुछ शाखाएँ और टैग हैं, और मैं अपने सभी इतिहास को रखना चाहूंगा।

ऐसा लगता है कि मुझे मूल रूप से सिर्फ एक करने की ज़रूरत है git push, लेकिन यह केवल masterशाखा को अपलोड करता है ।

मैं सब कुछ कैसे धक्का दे सकता हूं ताकि मुझे रिमोट पर अपने स्थानीय रेपो की पूरी प्रतिकृति मिल जाए?


सबसे छोटा और सबसे आसान उत्तर - stackoverflow.com/a/39992258/6648326
MasterJoe2

जवाबों:


898

अपनी सभी शाखाओं को पुश करने के लिए , या तो (रिमोट के नाम से REMOTE को बदलें, उदाहरण के लिए "मूल"):

git push REMOTE '*:*'
git push REMOTE --all

अपने सभी टैग पुश करने के लिए :

git push REMOTE --tags

अंत में, मुझे लगता है कि आप यह सब एक कमांड में कर सकते हैं:

git push REMOTE --mirror

हालाँकि, इसके अलावा --mirror, आपके रीमोट को भी आगे बढ़ाएगा, इसलिए यह ठीक वैसा नहीं हो सकता जैसा आप चाहते हैं।


53
--allइसके बजाय *:*अधिक मैत्रीपूर्ण लगता है
इडान के

56
मेरे भगवान ............. मैंने पूरे इंटरनेट को फाड़ दिया और मुझे पता चला कि - सभी का स्विच AAAAALLLLLLLLLLLLL है!
रकीब

21
बस यह देखते हुए कि git push REMOTE --allलौट आए No refs in common and none specified;कुछ नहीं कर रहे। है, जबकि git push REMOTE "*:*वास्तव में दूरदराज के सभी शाखाओं धक्का दे दिया।
Im0rtality

10
स्थानीय स्तर पर "tmp" या "फीचर" शाखाएँ होने की स्थिति में निरीक्षण करने के लिए -dry-run का उपयोग करें, स्थानीय स्तर पर जो आप वास्तव में REMOTE में अपडेट नहीं करना चाहते हैं
Jonno

55
यदि मूल रिमोट अभी भी उपलब्ध है, तो यह करना एक अच्छा विचार है git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
सुजैन डुपरॉन

156

मेरे जैसे मामले में कि आपने एक रेपो को निकाल दिया और अब दूरस्थ मूल को एक अलग रेपो, एक नए खाली एक पर स्विच कर रहे हैं ...

तो आपके पास अपनी रेपो और अंदर की सभी शाखाएं हैं, लेकिन आपको अभी भी उन शाखाओं को चेकआउट करने की जरूरत है ताकि git push --allकमांड वास्तव में उन्हें भी धक्का दे सके।

धक्का देने से पहले आपको यह करना चाहिए:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

के बाद

git push --all

4
यह वास्तव में भी सहायक है, क्योंकि मुझे सभी शाखाओं को मैन्युअल रूप से जांचना था। यह अगली बार के लिए अच्छा रहेगा।
Cory Imdieke

10
अजीब तरह से, git push '*:*'सभी शाखाओं को धक्का दिया। git push -allबस गुरु को धक्का दिया। मैं गितुब से बिटबकेट में रेपो परिवहन कर रहा था।
जेरेमाउस

3
हर एक शाखा की जाँच करने के बजाय आपको बस "जीट शाखा - ट्रैक $ रिमोट" करना चाहिए। विशाल भंडार में एक पुरानी शाखा की जाँच में कुछ समय लगता है
Moataz Elmasry

2
मुझे इसके लिए काम करने के लिए एक छोटा सा बदलाव करना पड़ा: --track remotes/$remoteइसके बजाय --track $remote। यहां पूरी कमांड लाइन है:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
एड्रियन टी

धन्यवाद, यह मेरे लिए काम करता है, उपरोक्त उत्तर भी काम नहीं करता है।
बेन्यामिन जाफरी

90

यहाँ एक ही बात जो स्थिति मैं में था के लिए बेहतर काम किया पर एक और ले रहा है। यह समस्या आप एक रिमोट की तुलना में अधिक है जहां हल करती है, दूरस्थ में सभी शाखाओं क्लोन करने के लिए चाहते हैं sourceदूरदराज के destinationलेकिन पहले से उन सब को बाहर की जांच किए बिना।

(डैनियल के समाधान के साथ मुझे जो समस्या थी, वह यह थी कि sourceअगर मैं पहले ही इसे पहले ही चेक कर चुका था, तो रिमोट से किसी ट्रैकिंग शाखा को चेकआउट करने से इंकार कर दूंगा, यह पुश से पहले मेरी स्थानीय शाखा को अपडेट नहीं करेगा)

git push destination +refs/remotes/source/*:refs/heads/*

नोट: यदि आप प्रत्यक्ष CLI का उपयोग नहीं कर रहे हैं, तो आपको तारांकन से बचना चाहिए:

git push destination +refs/remotes/source/\*:refs/heads/\*

यह रिमोट की सभी शाखाओं sourceको एक हेड ब्रांच में धकेल देगा destination, संभवत: एक गैर-फास्ट-फॉरवर्ड पुश। आपको अभी भी टैग को अलग से धकेलना होगा।


8
+1 यह मेरे लिए काम करता है, एक remoteसे दूसरे में क्लोनिंग । धन्यवाद!
लॉरेंस

4
मुझे तारांकन से बचना था:git push destination +refs/remotes/source/\*:refs/heads/\*
मैटाल्क्ंडर

2
मेरे लिए, यह घाव HEAD नामक एक शाखा को धक्का देता है, जो मुझे नहीं लगता कि इस परिदृश्य में जानबूझकर है।
मैक्सवेल

1
यह उत्तर मेरे लिए अविश्वसनीय रूप से उपयोगी था। तारांकन के इस प्रयोग के git-push (1) मैन पेज में एकमात्र उल्लेख --pruneविकल्प के लिए एक छोटे से उदाहरण में है।
लेनदिर

4
उत्कृष्ट उत्तर, सामान्य --mirrorपैरामीटर की तुलना में बहुत अलग, हर कोई अनुशंसा करता है। उन परिदृश्यों के लिए पूरी तरह से काम करता है, जहां आप केवल सिंक रखना चाहते हैं स्वचालन या ऑडिटिंग उद्देश्यों के लिए दो रीमोट।
विनीसियस जेवियर

15

यह सबसे संक्षिप्त तरीका है जो मैंने पाया है, बशर्ते कि गंतव्य खाली है। एक खाली फ़ोल्डर में स्विच करें और फिर:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

उपयुक्त के रूप में आदि के https://...लिए स्थानापन्न file:///your/repo


13

के लिए मैनपेज git-pushएक पढ़ने लायक है। इस वेबसाइट के साथ संयुक्त मैंने निम्नलिखित में लिखा है .git/config:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

इसका push = :मतलब है "किसी भी 'मिलान' शाखाओं (यानी शाखाएं जो पहले से ही दूरस्थ रिपॉजिटरी में मौजूद हैं और एक स्थानीय समकक्ष हैं) को push = refs/tags/*धक्का देते हैं , जबकि " का अर्थ है "सभी टैग को धक्का दें"।

इसलिए अब मुझे केवल git pushसभी मिलान शाखाओं और सभी टैग को धकेलने के लिए दौड़ना है।

हां, यह वह नहीं है जो ओपी चाहता था (धक्का देने के लिए सभी शाखाएं पहले से ही रिमोट साइड में मौजूद होनी चाहिए), लेकिन उन लोगों के लिए मददगार हो सकती हैं, जो इस सवाल को ढूंढते हुए कहते हैं कि "मैं किस तरह से शाखाओं और टैग को एक ही साथ धकेलता हूं" समय"।


13

मेरे मामले में जो काम किया गया था।

git push origin --all

4
सरल और आसान। यह काम करता हैं! originदूरस्थ URL Git रिपॉजिटरी के लिए उपनाम है।
N न्हु

8

एक दर्पण का भंडार

रिपॉजिटरी का एक नंगे क्लोन बनाएं।

git clone --bare https://github.com/exampleuser/old-repository.git

मिरर-पुश टू द न्यू रिपॉजिटरी।

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

चरण 1 में आपके द्वारा बनाए गए अस्थायी स्थानीय भंडार को निकालें।

cd ..
rm -rf old-repository.git

एक रिपॉजिटरी को मिरर करना जिसमें Git लार्ज फाइल स्टोरेज ऑब्जेक्ट हैं

रिपॉजिटरी का एक नंगे क्लोन बनाएं। उदाहरण उपयोगकर्ता नाम को उस व्यक्ति या संगठन के नाम से बदलें जो रिपॉजिटरी का मालिक है, और उदाहरण रिपॉजिटरी नाम को उस रिपॉजिटरी के नाम से बदलें जिसे आप डुप्लिकेट करना चाहते हैं।

git clone --bare https://github.com/exampleuser/old-repository.git

उस रिपॉजिटरी में नेविगेट करें जिसे आपने अभी क्लोन किया है।

cd old-repository.git

रिपॉजिटरी की Git लार्ज फ़ाइल स्टोरेज ऑब्जेक्ट्स में खींच लें।

git lfs fetch --all

मिरर-पुश टू द न्यू रिपॉजिटरी।

git push --mirror https://github.com/exampleuser/new-repository.git

रिपॉजिटरी की Git लार्ज फाइल स्टोरेज ऑब्जेक्ट को अपने मिरर पर पुश करें।

git lfs push --all https://github.com/exampleuser/new-repository.git

चरण 1 में आपके द्वारा बनाए गए अस्थायी स्थानीय भंडार को निकालें।

cd ..
rm -rf old-repository.git

उपरोक्त निर्देश गिथुब सहायता से आता है: https://help.github.com/articles/duplicating-a-repository/


1
जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगाबेहतर "लिंक-आधारित" उत्तर लिखने के निर्देशों के लिए यहां देखें । धन्यवाद!
घोस्टकैट

5

मैंने पाया कि उत्तर में अभी भी कुछ अस्पष्ट चीजें हैं, जो उपयोगकर्ताओं को गुमराह करेंगी। सबसे पहले, यह सुनिश्चित है कि git push new_origin --allऔर git push new_origin --mirrorमूल की सभी शाखाओं को डुप्लिकेट नहीं कर सकता है, यह आपके स्थानीय अस्तित्व वाली शाखाओं को आपके new_origin पर डुप्लिकेट करता है।

नीचे दो उपयोगी तरीके हैं जिनका मैंने परीक्षण किया है:

1, क्लोन नंगे रेपो द्वारा डुप्लिकेट। git clone --bare origin_url, तो फ़ोल्डर दर्ज करें, और git push new_origin_url --mirror.by इस तरह से, आप भी उपयोग कर सकते हैं git clone --mirror origin_url, दोनों --bareऔर --mirrorएक नंगे रेपो, कार्यक्षेत्र सहित नहीं डाउनलोड करेगा। देखें इस

2, यदि आपके पास उपयोग करके एक गिट रेपो है git clone, जिसका अर्थ है कि आपके पास नंगे रेपो और गिट कार्यक्षेत्र हैं, तो आप उपयोग कर सकते हैं git remote add new_origin new_origin_url, और फिर git push new_origin +refs/remotes/origin/\*:refs/heads/\*, और फिरgit push new_origin --tags

इस तरह, आपको एक अतिरिक्त हेड ब्रांच मिल जाएगी, जिसका कोई मतलब नहीं है।


2

शाखाओं और टैगों को धकेलने के लिए (लेकिन रिमोट नहीं):

git push origin 'refs/tags/*' 'refs/heads/*'

यह उन विकल्पों के संयोजन --tagsऔर --allविकल्पों के बराबर होगा git push, जिनकी अनुमति नहीं दी जाती है।


क्या दूसरे रिमोट से पुश करने का अतिरिक्त विकल्प है? उदाहरण के लिए+refs/remotes/source/*
यवेस मार्टिन

2

@ डैनियल जवाब में मैंने किया आधारित :

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

2
इससे भी बेहतर, के | grep -v masterसाथ प्रतिस्थापित किया जा सकता है | sed 's/\*//'(मैं मान रहा हूँ कि आप वर्तमान में चयनित शाखा masterसे पहले से ही खराब होने से बचने के लिए बाहर *निकल गए हैं) जो आपको आपकी वर्तमान में चयनित शाखा नहीं masterहोने पर किसी भी समस्या को शामिल करने और बचने की अनुमति देता है master। नेक्रोपोस्टिंग के लिए भी खेद है, यह सिर्फ इतना है कि इस जवाब ने आज मेरी मदद की और मैं अपने संशोधन को साझा करना चाहता था अगर यह मेरी स्थिति में दूसरों की मदद कर सके ...
ToVine

1

मैंने पाया कि इनमें से कोई भी मेरे लिए ठीक से काम नहीं कर रहा था। इसे मौत के मुंह में जाने के लिए स्वतंत्र महसूस करें लेकिन किसी कारण से ठीक से काम करने के लिए अन्य विकल्प नहीं मिल सके।

अपेक्षित परिणाम एक रेपो "क्लोन" के लिए दूसरे रिमोट (यानी जीथब से दूसरे प्रदाता तक) था:

  • सभी शाखाएँ नए रिमोट पर बनाई गई हैं
  • सभी शाखा इतिहास नए रिमोट पर बनाए गए हैं
    • (यह मैंने कोशिश की हर समाधान पर याद किया गया था)
  • सभी टैग नए रिमोट पर बनाए गए हैं
  • स्रोत आगे बढ़ता है (एक दिया गया)
  • गैर-विनाशकारी (पॉमर विकल्प को विराम देते हुए)

मुख्य मुद्दा जो मैं देख रहा था या तो सभी दूरस्थ शाखाएं नए रिमोट में फिर से नहीं बन पाईं। यदि कोई कमांड करता था, तो नए रिमोट का शाखा इतिहास नहीं था (यानी ऐसा git checkout branch; git logकरना अपेक्षित शाखा नहीं दिखाएगा)।

मैंने देखा कि git checkout -b branchnameजैसा मैं चाहता था , वैसा नहीं है git checkout branchname। मैंने देखा git checkout --track branchnameकि शाखा इतिहास को खींचने के लिए प्रकट नहीं हुआ था।

मेरा समाधान (शक्तियां आधारित):

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure

1

नीचे दिए गए आदेश में सभी शाखाओं को शामिल किया जाएगाgit branch -a ( उनमें से जिन्हें आपने कभी चेक-आउट नहीं किया है लेकिन आपके गिट रेपो में मौजूद है, आप उन्हें देख सकते हैं )

git push origin '*:*'

नोट: यह आदेश काम आता है जब आप संस्करण नियंत्रण सेवा (माइग्रेट कर रहे हैं यानी से पलायन Gitlab को GitHub )


1
संस्करण नियंत्रण सेवाओं के बीच पलायन और यह वही है जो मैं खोज रहा हूँ, चीयर्स!
लुका Lपोलजारी

1

मैं एक संस्करण नियंत्रण सेवा से दूसरे में स्विच करने की प्रक्रिया में था और सभी शाखाओं, टैग और इतिहास सहित सभी रिपॉजिटरी को क्लोन करने की आवश्यकता थी।

ऊपर प्राप्त करने के लिए मैंने अगला किया:

  • स्थानीय रिपॉजिटरी के लिए सभी शाखाओं को मैन्युअल रूप से चेकआउट करें (नीचे दिखाए गए सभी चेकआउट के लिए स्क्रिप्ट),
  • git push origin '*:*'

.sh स्क्रिप्ट स्थानीय रिपॉजिटरी की सभी शाखाओं को चेकआउट करने के लिए उपयोग की जाती है:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.