मैं एक फ़ोल्डर को एक सबवर्सन रिपॉजिटरी से दूसरे रिपॉजिटरी में कैसे स्थानांतरित करूं?


156

मेरे पास एक "डॉक्स" फ़ोल्डर है जो "प्रोजेक्ट" नामक एक सबवर्सन रिपॉजिटरी में है। मैं इस निष्कर्ष पर पहुंचा हूं कि इसे वास्तव में "प्रोजेक्ट_डॉक्स" नामक एक अलग सबवर्सन रिपॉजिटरी के तहत रखा जाना चाहिए।

मैं "डॉक्स" फ़ोल्डर ( और इसके सभी संशोधनों ) को "प्रोजेक्ट_डॉक्स" रिपॉजिटरी में स्थानांतरित करना चाहता हूं । क्या इसे करने का कोई तरीका है?

जवाबों:


183

यदि आपके पास रिपॉजिटरी का उपयोग होता है (काम की प्रतिलिपि नहीं), तो आपको वर्तमान रिपॉजिटरी को डंप करने में सक्षम होना चाहिए, इसे केवल डॉक्स फ़ोल्डर के बारे में जानकारी शामिल करने के लिए फ़िल्टर करें, और इसे अन्य रिपॉजिटरी में लोड करें।

कुछ इस तरह होगा:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

रिपॉजिटरी तक पहुंच के बिना, आप संशोधन इतिहास को बनाए नहीं रख सकते हैं और आपको फ़ाइलों को नए रिपॉजिटरी और कमिटिंग में कॉपी करने के लिए व्यवस्थित करना होगा।


1
अच्छा उदाहरण है। ध्यान दें कि जैसा कि मैंने दस्तावेज़ीकरण से कहा था, यह समाधान सभी संशोधनों को फिर से नंबर देगा ताकि "खाली" न हों। अगर आप डॉक्टर के संशोधनों का संदर्भ कहीं और रखते हैं, तो ध्यान रखें।
एडम बेलाएरे

1
मैंने खाली रिपॉजिटरी का एक गुच्छा टारगेट रिपॉजिटरी में खाली संशोधनों का एक गुच्छा जोड़ने से बचने का सुझाव दिया, सबसे अधिक संभावना किसी को भी भ्रमित करने के लिए जो लोड के बारे में नहीं जानते थे। चूंकि --preserve-Revprops लोडिंग के डिफॉल्ट एक का उपयोग करने के बजाय प्रतिबद्ध संदेश रखेंगे।
शमूएल

11
जवाब के लिए धन्यवाद। मामले में किसी को भी जानने की जरूरत है, अगर आपको और अधिक की आवश्यकता है, तो एक फ़ोल्डर में शामिल सूची में उनके बीच एक स्थान रखें। पूर्व। ... फोल्डर को शामिल करें folder.wo
रॉबिन रॉबिन्सन

6
पुनर्मूल्यांकन संशोधन शायद एक बुरा विचार है, जैसा कि संदेश और मुद्दा ट्रैकिंग उपकरण उन्हें संदर्भित कर सकते हैं
Wim Coenen

5
इसने मेरे लिए काम किया। मैं एक विंडोज़ उपयोगकर्ता (विजुअल एसवीएन सर्वर) हूं और मेरी पहली कमांड इस तरह दिखती है, अगर यह किसी की मदद करती है:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
क्रिस

30

svndumpfilter का एक गंभीर दोष है - यदि कोई फ़ाइल या पथ आपके द्वारा फ़िल्टर किए जा रहे पथ से कॉपी किया गया है, तो आप svndumpfilter इतिहास नहीं भर पाएंगे और कार्य विफल हो जाएगा।

यदि आप इस समस्या का अनुभव करते हैं तो आप svndumpfilter2 का उपयोग कर सकते हैं ।


4
यहाँ svndumpfilter2 के लिए एक बेहतर लिंक है: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

आप उस स्थिति में सूची में आवश्यक पथ जोड़ सकते हैं ... जितना संभव हो उतना विशिष्ट हो रहा है ... और फिर आयात के बाद परियोजना से उन प्रविष्टियों को हटा दें।
बजे जेम्स गाव्रोन

6

यह SVN प्रलेखन में चर्चा की है। की जाँच करें भंडार रखरखाव पर खंड svndumpfilter... यह विशेष रूप से बताता है कि किसी केंद्रीय भंडार से बाहर परियोजनाओं डंप और उन्हें नए, अलग खजाने में स्थानांतरित करने के लिए कैसे।


2

मुझे विश्वास नहीं है कि आप इसे दूरस्थ रूप से (यानी, एक स्थानीय प्रतिलिपि के बिना) कर सकते हैं। लेकिन यह काम करना चाहिए: svn exportमूल सर्वर से फ़ोल्डर, फिर svn addयह आपके नए रेपो के लिए।

पसंद:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

संपादित करें: D'oh, यह इतिहास को गिराता है। उपयोग svnadminके रूप में शमूएल का वर्णन करता है


3
हालाँकि, आप रिपॉजिटरी तक पहुँच के बिना संशोधन नहीं रख सकते। यदि आपके पास केवल एक काम करने वाली प्रति हो सकती है, तो यह सबसे अच्छा है जो वह कर सकता है।
शमूएल

2

आगामी संदर्भ के लिए:

SVN प्रलेखन स्पष्ट रूप से रिपोर्ट:

यदि आप शीर्ष-स्तरीय निर्देशिका को हटाने के लिए डंप फ़ाइल को मैन्युअल रूप से संपादित करने की योजना बनाते हैं, तो सुनिश्चित करें कि आपका संपादक स्वचालित रूप से अंत-पंक्ति के वर्णों को मूल स्वरूप में बदलने के लिए सेट नहीं है (उदाहरण के लिए, \ r \ n से \ n), चूंकि सामग्री मेटाडेटा से सहमत नहीं होगी। यह डंप फ़ाइल को बेकार कर देगा।

शीर्ष-स्तरीय निर्देशिका को स्थानापन्न करने के लिए sed या Vim का उपयोग करें, लेकिन यह निर्देशिका नाम प्रोजेक्ट फ़ाइल के अंदर भी शामिल था !!!! यह SVN लोड चेकसम त्रुटि का कारण बनता है।

इसलिए जब आप इस ऑपरेशन को करते हैं, तो केवल पथ नाम के sed के साथ स्ट्रिंग प्रतिस्थापन न करें।

"नोड-पथ: old_path" को "नोड-पथ: new_path" के साथ प्रतिस्थापित करें। अधिक विवरण के लिए SVN पुस्तक अध्याय 5 "रिपॉजिटरी एडमिनिस्ट्रेशन" देखें।


1

मैंने स्वीकार किए गए उत्तर का उपयोग करने की कोशिश की, लेकिन मेरे पास एक विशाल भंडार था और मैं एक छोटी निर्देशिका का निर्यात करना चाहता था, और मैं पूरे भंडार को डंप करने का जोखिम नहीं उठा सकता था।

इसलिए, मैंने केवल उन संशोधनों का निर्यात किया जहां मेरी निर्देशिका बदल गई (यह काम नहीं कर सकता है यदि आप जिस निर्देशिका को निर्यात करना चाहते हैं, वह आपके रेपो में अन्य स्थानों के संदर्भ में है)।

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

आपको अपने रेपो URL ( URL_to_docs), सर्वर में स्थान ( /svn/old_repo) और रिपॉजिटरी में डॉक्स के लिए पथ को बदलना होगा ( path/to/docs)

docs_only.dumpयदि आप अपनी नई निर्देशिका में अपनी डॉक्टर निर्देशिका का स्थान बदलना चाहते हैं तो आप आसानी से अपना संपादन कर सकते हैं ।

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