यह पता चला है कि अगर आप दो रिपोजिटरी को एक साथ चिपकाने की कोशिश कर रहे हैं और इसे बाहरी निर्भरता के प्रबंधन के बजाय ऐसा ही दिखाना है तो इसका जवाब बहुत आसान है। आपको बस अपने पुराने रिपो में रिमोट जोड़ने, उन्हें अपने नए मास्टर में विलय करने, फ़ाइलों और फ़ोल्डरों को एक उपनिर्देशिका में स्थानांतरित करने, चाल को करने, और सभी अतिरिक्त रिपोज़ के लिए दोहराने की आवश्यकता है। Submodules, subtree विलय, और फैंसी rebases एक अलग समस्या को हल करने के लिए इरादा है और मैं क्या करने की कोशिश कर रहा था के लिए उपयुक्त नहीं हैं।
यहाँ दो खजाने एक साथ गोंद के लिए एक उदाहरण PowerShell स्क्रिप्ट है:
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
dir > deleteme.txt
git add .
git commit -m "Initial dummy commit"
# Add a remote for and fetch the old repo
git remote add -f old_a <OldA repo URL>
# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories
# Clean up our dummy file because we don't need it any more
git rm .\deleteme.txt
git commit -m "Clean up initial file"
# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}
# Commit the move
git commit -m "Move old_a files into subdir"
# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"
जाहिर है आप के बजाय old_a में old_b मर्ज कर सकते हैं (जो नई संयुक्त रेपो हो जाता है) यदि आप बल्कि ऐसा चाहते हैं - संशोधित सूट करने के लिए लिपि।
आप के रूप में अच्छी तरह से में प्रगति सुविधा शाखाओं पर लाने के लिए चाहते हैं, इस का उपयोग करें:
# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress
प्रक्रिया के केवल गैर स्पष्ट हिस्सा है यही कारण है कि - कि एक सबट्री मर्ज नहीं है, बल्कि करने के लिए एक बहस सामान्य रिकर्सिव विलय जो गिट को बताता है कि हमने लक्ष्य का नाम बदल दिया है और इससे गिट लाइन को सबकुछ ठीक से मदद मिलती है।
मैंने थोड़ा और विस्तृत स्पष्टीकरण here लिखा।
स्रोत
2013-01-22 23:57:18
मैं गिट का उपयोग नहीं कर रहा हूं, लेकिन Mercurial में मैं रिपो के फ़ाइल पथ को विलय करने के लिए आवश्यक होने पर पहले कनवर्ट करना चाहता हूं, और फिर परिवर्तनों को प्राप्त करने के लिए लक्ष्य में एक रेपो को बलपूर्वक खींचें, और फिर विभिन्न शाखाओं का विलय करें। यह परीक्षण और काम करता है;) हो सकता है कि यह गिट के लिए समाधान खोजने में भी मदद करता है ... उप-मर्ज दृष्टिकोण की तुलना में मुझे लगता है कि कन्वर्ट चरण अलग है जहां इतिहास को पथ के मानचित्रण के बजाय इतिहास फिर से लिखा जाता है (अगर मैं समझता हूं सही ढंग से)। यह तब फ़ाइल पथों के किसी भी विशेष हैंडलिंग के बिना एक चिकनी विलय सुनिश्चित करता है। – Lucero
मुझे यह प्रश्न भी उपयोगी पाया गया http://stackoverflow.com/questions/1683531/how-to-import-existing-git-repository-into-another – nacross
मैंने एक फॉलो-अप प्रश्न बनाया है। दिलचस्प हो सकता है: दो गिट भंडारों को मर्ज करें और मास्टर इतिहास रखें: http://stackoverflow.com/questions/42161910/merge-two-git-repositories-and-keep-the-master-history –