इतिहास को संरक्षित करने वाले एक अन्य भंडार में गिट रिपॉजिटरी सामग्री को ले जाना


141

मैं निम्नलिखित आदेशों का उपयोग करके केवल एक रिपॉजिटरी ( repo1) की सामग्री को दूसरे मौजूदा रिपॉजिटरी ( repo2) में स्थानांतरित करने का प्रयास कर रहा हूं :

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

लेकिन यह काम नहीं कर रहा है। मैंने एक समान पोस्ट की समीक्षा की, लेकिन मुझे केवल एक फ़ोल्डर मिला, सामग्री नहीं।


क्या आप repo1 की सामग्री को repo2 पर एक शाखा के रूप में, या मास्टर के हिस्से के रूप में रखना चाहते हैं, इसलिए आपके काम करने वाले डायर में दोनों रेपो सह-अस्तित्व के फ़ोल्डर हैं?
क्रोनियल

मैं इसे मास्टर के हिस्से के रूप में स्थानांतरित करना चाहता हूं।
मारियो

4
यह ट्यूटोरियल सही है! smashingmagazine.com/2014/05/19/…
xpto

जवाबों:


242

मुझे लगता है कि आप जो आदेश देख रहे हैं, वे हैं:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

उसके बाद और repo2/masterसे सब कुछ शामिल होगा , और उन दोनों का इतिहास भी होगा।repo2/masterrepo1/master


धन्यवाद क्रोनियल, मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि repo1 की भी एक शाखा है और क्या होगा यदि मैं उस शाखा को भी rep2 पर स्थानांतरित करना चाहता हूं?
मारियो

अच्छा, क्या रेपो 2 की दूसरी शाखा भी है? या उस शाखा का क्या होना चाहिए?
क्रोनियल

1
क्रोनिकल, उपरोक्त कॉमन्स ने काम नहीं किया! यह इतिहास की नकल नहीं किया।
मारियो

1
ठीक है, अब यह काम किया। मैंने निम्न कमांड का उपयोग किया; cd repo2,> git रिमोट rm उत्पत्ति> git रिमोट ऐड ओरिजिन url-of-repo1 ,> git fetch r1remote> git पुश ओरिजिन मास्टर
मारियो

1
@abhijithda सबसे आसान उपाय यह होगा कि आप मर्ज करने से पहले सब कुछ repo1एक सबफ़ोल्डर (अंदर repo1) में स्थानांतरित कर दें।
क्रोनिकल

55

पूरी तरह से यहाँ वर्णित https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

सबसे पहले, हमें मौजूदा रिपॉजिटरी से हमारे स्थानीय सूचकांक में सभी दूरस्थ शाखाओं और टैग लाने होंगे:

git fetch origin

हम उन किसी भी लापता शाखाओं की जाँच कर सकते हैं जिनकी हमें एक स्थानीय प्रतिलिपि बनाने की आवश्यकता है:

git branch -a

आइए हमारे नए रिपॉजिटरी के SSH-क्लोन किए गए URL का उपयोग करके अपने मौजूदा स्थानीय रिपॉजिटरी में एक नया रिमोट बनाएं:

git remote add new-origin git@github.com:manakor/manascope.git

अब हम सभी स्थानीय शाखाओं और टैगों को नए मूल नाम के नए रिमोट पर धकेलने के लिए तैयार हैं:

git push --all new-origin 
git push --tags new-origin

चलो नए-मूल को डिफ़ॉल्ट रिमोट बनाते हैं:

git remote rm origin

नए-मूल को सिर्फ मूल नाम दें, ताकि यह डिफ़ॉल्ट रिमोट बन जाए:

git remote rename new-origin origin

4
पुष्टि कर सकते हैं कि यह पूरे इतिहास और टैग की प्रतिलिपि बनाता है। बहुत अच्छा। धन्यवाद।
एलेक्स

यदि नए-मूल की कोई प्रतिबद्धता नहीं है, तो यह अच्छी तरह से काम करता है। हालांकि, अगर नए-मूल में कोई प्रतिबद्धता है, तो यहां जिस तरह का उल्लेख किया गया है वह उम्मीद के मुताबिक शब्द नहीं होगा।
caot

git checkout BranchNameफिर आपको शाखा को फिर से दूरस्थ रेपो के साथ धकेलने की आवश्यकता है, git push --all new-origin लेकिन फिर से बहुत बहुत धन्यवाद
Raad Altaie

21

यदि आप मौजूदा शाखाओं को संरक्षित करने और इतिहास बनाने के लिए देख रहे हैं, तो यहां एक तरीका है जो मेरे लिए काम करता है।

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

अब, मान लीजिए कि आप स्रोत और गंतव्य भंडार को एक समयांतराल में रखना चाहते हैं। उदाहरण के लिए, वर्तमान दूरस्थ रेपो के भीतर अभी भी गतिविधि है जिसे आप नए / प्रतिस्थापन रेपो में लाना चाहते हैं।

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

नवीनतम अपडेट खींचने के लिए (यह मानते हुए कि आपके पास कोई स्थानीय परिवर्तन नहीं है):

git checkout {branch(es) of interest}
git pull old
git push --all new

NB: मेरे पास अभी तक सबमॉड्यूल का उपयोग करने के लिए नहीं है, इसलिए मुझे नहीं पता कि यदि आपके पास है तो अतिरिक्त चरणों की क्या आवश्यकता हो सकती है।


1
यह मेरे लिए बस और आसानी से काम कर गया। मुझे लगता है कि यह जांचा हुआ जवाब होना चाहिए। यदि आपके पास 60 शाखाएं हैं, तो यह जाने का रास्ता है।
rickfoosusa

7

सरल दृष्टिकोण अगर कोड पहले से ही गिट द्वारा ट्रैक किया गया है तो पुश करने के लिए अपने "मूल" के रूप में नया रिपॉजिटरी सेट करें।

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

इसने मेरे स्थानीय रेपो (इतिहास सहित) को मेरे दूरस्थ github.com रेपो में स्थानांतरित करने का काम किया। GitHub.com पर नया खाली रेपो बनाने के बाद मैं नीचे चरण तीन में URL का उपयोग करता हूं और यह बहुत अच्छा काम करता है।

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 --mirror

मुझे यह पता चला: https://gist.github.com/niksumeiko/8972566


1
मूल भंडार को जाने देने का यह सबसे आसान तरीका है। यह सभी शाखाओं को भी कॉपी करता है।
गिलर्मो

1
यह भी सभी टैग की प्रतिलिपि बनाता है।
रावेन

2

मैंने सभी शाखाओं को बनाए रखने और इतिहास बनाने के लिए GITLab में अपने GIT स्टैश को स्थानांतरित करने के लिए नीचे की विधि का उपयोग किया।

स्थानीय के लिए पुराने भंडार पर क्लोन करें।

git clone --bare <STASH-URL>

GitLab में एक खाली भंडार बनाएँ।

git push --mirror <GitLab-URL>

1

ऐसा लगता है कि आप करीब हैं। यह मानते हुए कि यह आपके सबमिशन में सिर्फ एक टाइपो नहीं है, स्टेप 3 cd repo2रेपो 1 के बजाय होना चाहिए । और चरण 6 git pullधक्का नहीं होना चाहिए । सूचीबद्ध सूची:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

धन्यवाद एरिक, लेकिन चरण 3 में मैं किसी भी दूरस्थ परिवर्तन करने से बचने के लिए मूल भंडार के लिंक को हटाना चाहता हूं .. जैसा कि मैं सामग्री को repo1 से repo2 में स्थानांतरित करना चाहता हूं।
मारियो

ठीक है। मैंने अपने उत्तर को संपादित करने की कोशिश की है। बस यह सुनिश्चित करने के लिए, आप एक रिपॉजिटरी, रेपो 2 बनाने की कोशिश कर रहे हैं, जो कि रेपो 1 की एक प्रति है लेकिन रेमो 1 या मूल को रीमोट के रूप में नहीं रखता है?
एरिक पैलेस

नहीं, मैं एक नया रेपो "रेपो 2" बनाने की कोशिश नहीं कर रहा हूं। असल में, मेरे पास एक मौजूदा रेपो 2 है जिसमें अन्य सामग्री मौजूद हैं। अब मैं सभी repo1 सामग्री को repo2 में इतिहास के साथ स्थानांतरित करना चाहता हूं। मैं रेपो 1 को खाली रखूंगा क्योंकि यह सर्वर में है।
मारियो

क्या आपने विचार का उपयोग नहीं किया है? ऐसा लगता है कि आप शायद फाइलों को कॉपी कर सकते हैं (एक gui या scp या ftp के माध्यम से) और मैन्युअल रूप से उन्हें अपने गिट रेपो में जोड़ें। यह उतना कुशल नहीं हो सकता है, लेकिन यह अधिक सरल है।
एरिक पैलेस

मैंने पहले ही कोशिश कर ली लेकिन इसने इतिहास छोड़ दिया। मैं इसके इतिहास को भी आगे बढ़ाना चाहता हूं।
मारियो

1

@ दान-कोहन उत्तर के अनुसार मिरर-पुश यहां आपका मित्र है। यह मेरा प्रवासन प्रतिनिधि के लिए है:

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

1 Bऑपन गित बैश।

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

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

3 नए रिपॉजिटरी के लिए प्रमुख-धक्का।

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

4 चरण 1 में आपके द्वारा बनाई गई अस्थायी स्थानीय रिपॉजिटरी को हटा दें।

$ cd ..
$ rm -rf old-repository.git

संदर्भ और क्रेडिट: https://help.github.com/en/articles/duplicating-a-repository


-1

यहाँ बहुत सारे जटिल उत्तर हैं; हालाँकि, यदि आप शाखा संरक्षण से चिंतित नहीं हैं, तो आपको बस इतना करना होगा कि दूरस्थ मूल को रीसेट करें, अपस्ट्रीम सेट करें, और पुश करें।

इसने मेरे लिए सभी प्रतिबद्ध इतिहास को संरक्षित करने का काम किया।

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.